Manipulation XML et Environment windows [Résolu]

Messages postés
86
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
13 juillet 2013
- - Dernière réponse : Sentynel
Messages postés
86
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
13 juillet 2013
- 28 nov. 2011 à 21:50
Bonjour à tous,
Je viens vous demander conseil car je travail actuellement sur un logiciel permettant de verifié sur le disque dur si tel ou tel dossiers existent (path), et, si ils existent, celui-ci viens les copier dans un dossier principal (restauration)

J'ai donc au préalable rempli mon fichier XML que l'ont va nommé Database.XML, celui-ci contiendra les dossier de restauration, les noms, les dossiers d'enregistrement. Voici :

<?xml version="1.0" encoding="utf-8" ?>

<Games>

  <title>123KickIt</title>
  <Game name="1...2...3...KICK IT!"/>
  <location_path environment_variable="%LOCALAPPDATA%" path="\123KickIt"/>
  <storage environment_variable="%STORAGE%" path="\123KickIt"/>

  <title>AaaaaRecklessDisregard</title>
  <Game name="AaaaaRecklessDisregard"/>
  <location_path environment_variable="%LOCALAPPDATA%" path="\AaaaaRecklessDisregard"/>
  <storage environment_variable="%STORAGE%" path="\AaaaaRecklessDisregard"/>
  
</Games>


Je rapelle que ceux-ci sont des exemples, ils se peu qu'il y ai plus de 200 "Games" de ce genre.

Enfin bref, ensuite, dans ma Mainform, j'ai donc mit un bouton pour verifié sur ces dossiers (location_path) existent.
Voici :

    Private Sub GetListButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GetListButton.Click

        Dim doc As XDocument = XDocument.Load(Application.startuppath & "\XMLDatabase.xml")

        'Use Linq to select what we need from thos doc
        Dim games = From g In doc.Descendants("Games")
         Select New With {
         .name = g.Descendants("Game").Value,
         .path = g.Descendants("location_path").Value,
         .storage = g.Descendants("storage").Value
        }

        'Loop each game, adding it to our database
        For Each Game In games
            'Create as new instance of gameinfo
            Dim currentGame As New GameInfo
            Dim name As String = Game.name
            currentGame.path = Game.path
            currentGame.storage = Game.storage
            'At this point, replae our path variables
            currentGame.path = Update_Path(Game.path)
            'Add to our list of games
            database.Add(name, currentGame)
        Next

        For Each game As KeyValuePair(Of String, GameInfo) In database
            ListBoxGames.Items.Add(game.Key)
        Next


Le probleme c'est que ce code n'ajoute que un seul case blanche dans ma listbox.
Comment faire s'il vous plait ?
Merci. :)
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
3
Merci
Pour reprendre ton exemple, tu peux les rechercher comme ceci :
        Dim doc As XDocument = XDocument.Load("Database.xml")
        Dim games As IEnumerable(Of XElement) = From g In doc.Descendants("Game")
        For Each game As XElement In games
            Debug.Print("------------")
            Debug.Print("name= " & game.Attribute(game.FirstAttribute.NextAttribute.Name).Value)
            'puisque tu n'as que 2 nodes on prend le premier node...
            Dim first As XElement = DirectCast(game.FirstNode, XElement)
            'ici ce sera location_path
            Debug.Print(first.Name.ToString & ":")
            '(en plus il n'y a que 2 attributs)
            Debug.Print("environement_var= " & first.FirstAttribute.Value)
            Debug.Print("path= " & first.LastAttribute.Value)

            '...puis le dernier node
            Dim last As XElement = DirectCast(game.LastNode, XElement)
            'ici ce sera storage
            Debug.Print(last.Name.ToString & ":")
            Debug.Print("environement_var= " & last.FirstAttribute.Value)
            Debug.Print("path= " & last.LastAttribute.Value)
        Next

Pose des points d'arrêts (F9) et observe les valeurs des nodes.
Bonne prog.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 116 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Utilisateur anonyme
Messages postés
86
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
13 juillet 2013
0
Merci
Petite rectification :

Je viens de modifier un peu le code, et maintenant j'ai un item dans ma listbox qui est :

<Games> <title>123Kickit</title> <game name="1...2...3...KICK IT!/>... etc etc

Mon code :

    Private Sub GetListButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GetListButton.Click

        Dim doc As XDocument = XDocument.Load(Application.startuppath & "\XMLDatabase.xml")

        Dim games = From g In doc.Descendants("Games")
         Select New With {
         .name = g.Descendants("Game").Value,
         .path = g.Descendants("location_path").Value,
         .storage = g.Descendants("storage").Value
        }

        For Each strings In games
            ListBoxGames.Items.Add(doc.Document)
        Next
    End Sub


Mais ce n'est toujours pas ce que je veut. J'ai juste besoin du "Game name". Merci :)
Commenter la réponse de Sentynel
Messages postés
86
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
13 juillet 2013
0
Merci
Quelqu'un, s'il vous plait ?
Commenter la réponse de Sentynel
0
Merci
Bonsoir,

Ce qui me gêne dans ton exemple c'est la structure de ton xml.
Toutes les balises 'title', par exemple, sont désolidarisées de la balise 'Game'.
Les noeuds, ainsi dispersés, rendent la lecture compliquée.

A mon avis, la structure du xml devrait plutôt ressembler à ceci pour que les recherches soient plus efficaces :
<?xml version="1.0" encoding="utf-8" ?>
<Games>
   <Game title="123KickIt" name="1...2...3...KICK IT!">
      <location_path environment_variable="%LOCALAPPDATA%" path="\123KickIt"/>
      <storage environment_variable="%STORAGE%" path="\123KickIt"/>
   </Game>
   <Game title="AaaaaRecklessDisregard" name="AaaaaRecklessDisregard">
      <location_path environment_variable="%LOCALAPPDATA%" path="\AaaaaRecklessDisregard"/>
      <storage environment_variable="%STORAGE%" path="\AaaaaRecklessDisregard"/>
   </Game>
</Games>
Commenter la réponse de Utilisateur anonyme
0
Merci
Pour chercher l'attribut 'name' d'un 'Game' il te suffira alors d'écrire :
Dim doc As XDocument = XDocument.Load("XMLDatabase.xml")
Dim games As IEnumerable(Of XElement) = From g In doc.Descendants("Game")
For Each game As XElement In games
    'firstattribute est 'title' et firstattribute.nextattribute est 'name'
    ListBoxGames.Items.Add(game.Attribute(game.FirstAttribute.NextAttribute.Name).Value)
Next

Bonne prog.
Commenter la réponse de Utilisateur anonyme
Messages postés
86
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
13 juillet 2013
0
Merci
Merci, je vais prendre exemple, je vous tiens au courant !
Commenter la réponse de Sentynel
Messages postés
86
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
13 juillet 2013
0
Merci
J'ai pris votre structure XML qui est plus lisible en effet,
Jusque ici ca marche, maintenant j'ai ma function :

 
   Private Function Update_Path(path As String) As String
        path = Replace(path, "%STORAGE%", TextBox0.Text & "\Games")
        path = Replace(path, "%LOCALAPPDATA%", Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData))

        Return path
    End Function


Qui sert à convertir les environment variable dans le fichier xml en chemin.

Mon problème : Comment puis-je faire pour que le code du button "Get list" n'ajoute que les dossiers existant sur le disque dur ?

J'ai essaier ceci :

        Dim doc As XDocument = XDocument.Load("Database.xml")
        Dim games As IEnumerable(Of XElement) = From g In doc.Descendants("Game")
        For Each game As XElement In games
            MsgBox(game.Attribute(game.FirstAttribute.NextAttribute.Name).Value)
            If System.IO.Directory.Exists(game.Attribute(game.FirstAttribute.NextAttribute.Name).Value) Then
                ListBoxGames.Items.Add(game.Attribute(game.FirstAttribute.NextAttribute.Name).Value)
            End If
        Next


En gros il me faudrai savoir comment faire pour recupéré la valeur "environment variable" et la valeur "path"

Merci ! :)
Commenter la réponse de Sentynel
Messages postés
86
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
13 juillet 2013
0
Merci
CA MARCHE !!! Merci beaucoups!

Voici le code pour obtenir les chemins existant :

        Dim doc As XDocument = XDocument.Load("Database.xml")
        Dim games As IEnumerable(Of XElement) = From g In doc.Descendants("Game")
        For Each game As XElement In games

            Dim first As XElement = DirectCast(game.FirstNode, XElement)
            Dim last As XElement = DirectCast(game.LastNode, XElement)

            If System.IO.Directory.Exists(Update_Path(first.FirstAttribute.Value) & first.LastAttribute.Value) Then
                ListBoxGames.Items.Add(game.Attribute(game.FirstAttribute.NextAttribute.Name).Value)
            End If


Merci pour votre aide ! :)
Commenter la réponse de Sentynel

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.