从XDocument获取子节点的值

25

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

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

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

如果我使用Address而不是ACTNumber,那么它可以工作。但它没有提供子节点的值。

2个回答

46

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

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

或者将其作为long获取:

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

需要放置 doc.Root.Element().Element() 吗?无论在哪个级别找到,最快的方法是直接获取“ACTNumber”的第一个出现位置是什么? - MarioDS
4
为此,您可以使用doc.Descendants("ACTNumber").First() - Jon Skeet

8
请使用以下代码:
xDocTest.Root.Element("Cust").Element("Adress").Element("City").Value

如果您使用Elements(注意复数形式),它会提供一个IEnumerable,可以这样使用:
XML
<Father>
    <Child>Hello</Child>
    <Child>World!</Child>
</Father>

C#

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

或者以你的例子为例:
foreach(var child in xdoc.Root.Element("Cust").Element("Address").Elements()) 
    Console.WriteLine(string.Format("{0} : {1}", child.Name, child.Value);

我不确定如果您有多个同名元素,Element会如何行事。因此,您可能需要使用Elements并遍历所有出现的元素。

在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;

你不能这样做,这是代码块的主要作用,防止任何标记被视为标记而不是文本。 - Servy
我想在我的句子中使用它,句子以“如果你使用…”开头。 - CSharpie
我想获取ACTNumber的值,并且更喜欢使用linq表达式,这样我就不需要为每个元素编写for循环了。 - user1532976
把一个foreach转换成from...select不应该那么难。 - CSharpie
我拿回了我的示例,并将其设置为每个客户一个ACTNumber。 如果这还不足以理解如何工作的示例代码,可能存在某种完全不同的问题... - CSharpie
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接