2013-04-25 12 views
16

Ich brauche Wert von untergeordneten Knoten aus XDocument bekommen Linq mitWie Wert von untergeordneten Knoten aus XDocument bekommen

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

ich dies versucht: xDocTest.Root.Elements("Cust").Elements("ACTNumber")

Wenn ich versuche Adresse statt ACTNumber dann funktioniert es . Aber es gibt nicht den Kindknotenwert.

Antwort

35

Wenn es nur ein Cust Element und nur ein ACTNumber Element, dann ist es einfach:

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

Oder erhalten Sie es als long:

long actNumber = (long) doc.Root.Element("Cust").Element("ACTNumber"); 
+0

ist es wirklich notwendig, 'doc.Root.Element(). Element()'? Was ist der kürzeste Weg, um sofort zu "ACTNumber" zu kommen, egal auf welcher Ebene? – MarioDS

+1

@MDeSchaepmeester: Dafür würden Sie 'doc.Descendants (" ACTNumber ") verwenden. First()' –

6

verwenden:

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

Wenn Sie Elemente (die Plural beachten) gibt es u eine IEnumerable, dies wie folgt verwendet werden würde:

XML

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

C#

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

Oder, um Ihr Beispiel zu nehmen:

Ich bin nicht sicher, wie Element verhält, wenn Sie mehrere Elemente mit dem gleichen Namen haben. Vielleicht möchten Sie also Elemente verwenden und für alle Vorkommen inerieren.

Und in Linq Wenn es mehr als ein Kunde ...

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; 
+0

Cant Finde heraus, wie man die s aus den Elementen fett macht ... – CSharpie

+0

Du kannst nicht, das ist der primäre Punkt eines Codeblocks, um zu verhindern, dass Markup als Markup statt als Text behandelt wird. – Servy

+0

Ich wollte es in meinem Satz verwenden beginnend mit "Wenn Sie ..." – CSharpie

Verwandte Themen