web-dev-qa-db-fra.com

Comment obtenir la valeur du nœud enfant à partir de XDocument

J'ai besoin d'obtenir la valeur du nœud enfant de XDocument en utilisant linq

<root>
<Cust>
     <ACTNumber>1234</ACTNumber>
     <Address>
         <Street></Street>
         <City>123 Main street</City>
         <State>AL</State>
     </Address>
</Cust>
</root>

J'ai essayé ceci: xDocTest.Root.Elements("Cust").Elements("ACTNumber")

Si j'essaie Adresse au lieu de ACTNumber alors cela fonctionne. Mais cela ne donne pas de valeur au nœud enfant.

19
user1532976

S'il n'y a qu'un seul élément Cust et un seul élément ACTNumber, alors c'est simple:

string actNumber = doc.Root.Element("Cust").Element("ACTNumber").Value;

Ou pour l'obtenir sous forme de long:

long actNumber = (long) doc.Root.Element("Cust").Element("ACTNumber");
38
Jon Skeet

Utilisez ceci:

xDocTest.Root.Element("Cust").Element("Adress").Element("City").Value

Si vous utilisez Elements (notez le pluriel), cela vous donne un IEnumerable, ceci serait utilisé comme ceci:

XML

<Father>
    <Child>Hello</Child>
    <Child>World!</Child>
</Father>

C #

foreach(var childElement in Root.Elements("Child")) Console.WriteLine(childElement.Value);

Ou pour prendre votre exemple:

foreach(var child in xdoc.Root.Element("Cust").Element("Address").Elements()) 
    Console.WriteLine(string.Format("{0} : {1}", child.Name, child.Value);

Je ne sais pas comment Element se comporte si vous avez plusieurs éléments du même nom. Vous pouvez donc utiliser Elements et Inerate sur toutes les occurrences.

Et à Linq S'il y a plus d'un client ...

var result = from cust in xdoc.Root.Elements("Cust")

             where cust.Elements("ACTNumber").Any() // This is to make sure there
                                                    // is an element called ACTNumber
                                                    // otherwise .Value would create
                                                    // Nullrefexception.

             select child.Element("ACTNumber").Value;
6
CSharpie