2010-12-16 171 views
1

j'ai essayé d'analyser un fichier XML comme ceci:Parse XDocument pour les attributs

<books> 
    <book> 
     <attr name="Moby Dick">Moby Dick is a classic</attr> 
     <attr isbn="isbnNumber">123456789</attr> 
    </book> 
</books> 

Comment puis-je obtenir la valeur de « 123456789 »? Je n'ai pas vraiment besoin du premier attribut.

J'ai essayé de les lire dans une boucle foreach contenant XElements mais je reçois toujours une exception d'objet NULL.

foreach(XElement xe in XDoc.Attribute("attr")) 
{ 
    string str = xe.Attribute("isbnNumber").Value // NULL EXCEPTION HERE 
} 

Merci à l'avance ...

+0

Un XML bizarre ... pourquoi faites-vous ces attributs enfants de 'Book' au lieu de'

Répondre

1

123456789 est en fait la valeur d'un élément, pas un attribut. Ce que vous voulez peut être fait comme ceci:

XElement attr = xDoc.Descendants("attr") 
        .FirstOrDefault(x=> 
         (string)x.Attribute("isbn") == "isbnNumber" 
        ); 

string isbn = (string)attr; 

Vous pouvez même faire une ligne, mais cela pourrait être plus facile à lire si vous êtes nouveau à LINQ to XML.

2

Vous pouvez essayer d'utiliser la méthode d'extension XPathSelectElement() [vous devrez utiliser System.Xml.XPath pour les obtenir].

E.g.

var isbn = xDoc.XPathSelectElement("//book/attr[@isbn='isbnNumber']").Value 

PS. Un bon testeur XPath est à: http://www.yetanotherchris.me/home/2010/6/7/online-xpath-tester.html

+0

Personnellement, je suis d'accord que XPath est probablement le meilleure solution ici. Je n'ai jamais été particulièrement impressionné par le format LINQ to XML. – Josh

+0

Moi aussi ... XPath rend les requêtes profondes infiniment plus lisibles mais elles représentent aussi une autre syntaxe pour un développeur de maintenance (surtout si vous faites des choses complexes). Bien que dans cet exemple, c'est beaucoup plus propre et tout aussi facile à comprendre à mon avis! – Reddog

0

Eh bien, je ne peux pas comprendre comment répondre aux réponses individuelles ..... mais je les ai mises en œuvre et les deux fonctionnent. Je vais avec la réponse de Reddog car c'est un peu plus simple et étant nouveau pour LINQ c'est le plus facile pour la lisibilité.

Merci pour les réponses!