如何从XDocument获取子节点的值

use*_*976 21 c# xml linq

我需要使用linq从XDocument获取子节点的值

<root>
<Cust>
     <ACTNumber>1234</ACTNumber>
     <Address>
         <Street></Street>
         <City>123 Main street</City>
         <State>AL</State>
     </Address>
</Cust>
</root>
Run Code Online (Sandbox Code Playgroud)

我试过这个: xDocTest.Root.Elements("Cust").Elements("ACTNumber")

如果我尝试使用Address而不是ACTNumber,那么它可以工作.但它没有给出子节点值.

Jon*_*eet 40

如果只有一个Cust元素而且只有一个ACTNumber元素,那么很容易:

string actNumber = doc.Root.Element("Cust").Element("ACTNumber").Value;
Run Code Online (Sandbox Code Playgroud)

或者将其作为long:

long actNumber = (long) doc.Root.Element("Cust").Element("ACTNumber");
Run Code Online (Sandbox Code Playgroud)

  • @MDeSchaepmeester:为此,你要使用`doc.Descendants("ACTNumber").First()` (3认同)

CSh*_*pie 6

用这个:

xDocTest.Root.Element("Cust").Element("Adress").Element("City").Value
Run Code Online (Sandbox Code Playgroud)

如果你使用Elements(注意复数),它给你一个IEnumerable,这将使用如下:

XML

<Father>
    <Child>Hello</Child>
    <Child>World!</Child>
</Father>
Run Code Online (Sandbox Code Playgroud)

C#

foreach(var childElement in Root.Elements("Child")) Console.WriteLine(childElement.Value);
Run Code Online (Sandbox Code Playgroud)

或者举个例子:

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

如果您有多个同名元素,我不确定Element的行为方式.因此,您可能希望在所有出现时使用Elements和Inerate.

在Linq如果有多个客户......

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;
Run Code Online (Sandbox Code Playgroud)