IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[C#] Linq to Xml


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 177
    Par défaut [C#] Linq to Xml
    Voila j'ai un petit fichier xml de configuration que j'aimerais charger. J'ai créé une fonction qui le fait mais ça ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public void fromXml () {
    			if ( File.Exists(configSetting) ) {
    				XDocument xml = XDocument.Load(configSetting);
     
    				var folder = from f in xml.Elements("AOFolder")
    							 select new { Path = f.Attribute("Root").Value };
     
    				var accounts = from account in xml.Descendants("Accounts")
    							   select new Config{
    								   Nom = account.Attribute("Name").Value,
    								   Chemin = account.Attribute("Path").Value
    							   };
     
    				foreach (var f in folder) {
    					gtb_aoFolder.Text = f.Path; 
    				}
     
    				glv_account.Items.Clear();
    				Global.configList.Nettoyer();
    				foreach ( Config c in accounts ) {
    					Global.configList.Ajouter(c);
    					glv_account.Items.Add(c.Nom);
    				}
    			}
    		}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <!--Config List-->
    <Prefs>
      <AOFolder Root="C:\Jeux" />
      <Accounts>
        <Account Id="0" Name="Toto" Path="C:\Jeux\Plop.txt" />
        <Account Id="1" Name="Toto2" Path="C:\Jeux\Bidule2.txt" />
      </Accounts>
    </Prefs>
    La requete folder me retourne rien du tout. Comment faire pour que ça marche?

    La requete accounts me lance une NullReferenceException (La référence d'objet n'est pas définie à une instance d'objet)

    J'ai entendu parler de l'App.config, c'est quoi la différence avec mon Config.xml (sachant que je suis en lecture/écriture)?

    Il y a pas un moyen plus élégant de faire mon chargement?


    Merci d'avance

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    Au hasard, j'ai pas testé, je remplaçerais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    xml.Elements("AOFolder") par xml.Descendants("AOFolder")
    Tu fais ici une recherche dans le XDocument. Il n'a qu'un seul objet dans Elements : <Prefs />. C'est donc normalement qu'il ne retourne rien. Par contre, si tu cherches dans tous les descendants, tu trouveras bien ton AOFolder.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    xml.Descendants("Accounts") par xml.Descendants("Account")
    Tu fais ici une recherche sur les descendants <Accounts />. Il te retourne un élément mais cet élément n'a ni attribut Name, ni attribut Path. Ce qui t'intéresse, c'est plutôt les <Account /> et là il n'y a aura plus d'exception.

  3. #3
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 2
    Par défaut
    Si tu veux utiliser plusieurs folder, change ton xml par ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <!--Config List-->
    <Prefs>
      <AOFolders>
    	 <Folder Root="C:\Jeux" />
      </AOFolders>
      <Accounts>
        <Account Id="0" Name="Toto" Path="C:\Jeux\Plop.txt" />
        <Account Id="1" Name="Toto2" Path="C:\Jeux\Bidule2.txt" />
      </Accounts>
    </Prefs>
    sinon enlève la boucle et utilise le .Single()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     gtb_aoFolder.Text = folder.Single().Path;
    Pour ce qui est du LINQ, utilise ça pour juste 1 élément
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var folder = from f in xml.Element("AOFolder").Attributes()
                                 where  f.Name == "Root"
                                 select new { Path = f.Value };
    ou sinon si tu en veux plusieurs avec le "nouveau" format XML, utilise ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
       var folder = from f in xml.Element("AOFolder").Elements()
                                 select new { Path = f.Attribute("Root").Value };
    ça devrait bien fonctionner, sinon, il y a de la bonne doc sur msdn:

    http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 177
    Par défaut
    @skatanick : le single peut pas marcher vu que la requête ne marche pas (et oui il n'y a que un folder c'est pour que ça que je l'ai mis en attribut).
    Pour ton autre requête j'ai le même problème que avec ma requête accounts (NullReferenceException)


    @Kaidan : ta solution marche très bien mais je comprend pas pourquoi.
    Le descendant c'est pas sensé être les nœud fil de celui passé en paramètre?

Discussions similaires

  1. [Linq to Xml] Probleme de requete
    Par Gregory.M dans le forum Linq
    Réponses: 6
    Dernier message: 27/05/2008, 08h54
  2. [LINQ to XML] Connexion à un fichier xml
    Par Gregory.M dans le forum Linq
    Réponses: 5
    Dernier message: 25/05/2008, 11h32
  3. [Linq To XML] Modifier l'objet, le xml ?
    Par Ticoche dans le forum Framework .NET
    Réponses: 13
    Dernier message: 28/04/2008, 11h12
  4. Réponses: 7
    Dernier message: 10/02/2008, 11h56
  5. Réponses: 1
    Dernier message: 30/05/2007, 20h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo