【问题标题】:How to get value of child node from XDocument如何从 XDocument 获取子节点的值
【发布时间】:2013-04-19 17:59:14
【问题描述】:

我需要使用 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 那么它可以工作。但它没有给子节点值。

【问题讨论】:

    标签: c# xml linq


    【解决方案1】:

    如果只有一个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”的最短方法是什么,第一次出现,无论它位于哪个级别?
    • @MDeSchaepmeester:为此,您可以使用doc.Descendants("ACTNumber").First()
    【解决方案2】:

    使用这个:

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

    如果您有多个同名元素,我不确定元素的行为方式。因此,您可能希望对所有事件使用 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;
    

    【讨论】:

    • 你不能,这是代码块的主要点,以防止任何标记被视为标记而不是文本。
    • 我想在以“If you use...”开头的句子中使用它
    • 我想获取 ACTNumber 值并更喜欢 linq 表达式,这样我就不需要为每个元素编写 for 循环
    • 将 foreach 变成 from...select 应该不难
    • @user1532976:ACTNumber 肯定只有一个吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    相关资源
    最近更新 更多