Manipulation XML et Environment windows

Résolu
Sentynel Messages postés 85 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 13 juillet 2013 - 27 nov. 2011 à 21:46
Sentynel Messages postés 85 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. :)

8 réponses

Utilisateur anonyme
28 nov. 2011 à 21:35
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.
3
Sentynel Messages postés 85 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 13 juillet 2013
27 nov. 2011 à 22:18
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 :)
0
Sentynel Messages postés 85 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 13 juillet 2013
28 nov. 2011 à 09:05
Quelqu'un, s'il vous plait ?
0
Utilisateur anonyme
28 nov. 2011 à 15:29
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>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
28 nov. 2011 à 15:54
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.
0
Sentynel Messages postés 85 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 13 juillet 2013
28 nov. 2011 à 20:19
Merci, je vais prendre exemple, je vous tiens au courant !
0
Sentynel Messages postés 85 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 13 juillet 2013
28 nov. 2011 à 20:40
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 ! :)
0
Sentynel Messages postés 85 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 13 juillet 2013
28 nov. 2011 à 21:50
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 ! :)
0
Rejoignez-nous