使用Linq和XDocument,我可以获取父标记下的所有子元素吗?

时间:2011-04-25 16:14:09

标签: c# .net xml linq-to-xml

我有一个XML

<data>
  <summary>
    <account curr_desc='USD' acct_nbr='123' net='1000.00' />
    <account curr_desc='USD' acct_nbr='456' net='2000.00' />
  </summary>
  <details>
    <accounts>
      <account acct_nbr="123" curr="USD">
        <activity color='False' settle_date='02 Jul 2010' amt='580.00' />
        <activity color='True' settle_date='09 Jul 2010' amt='420.00' />
      </account>
      <account acct_nbr="456" curr="USD">
        <activity color='True' settle_date='12 Dec 2010' amt='1500.00' />
        <activity color='True' settle_date='19 Dec 2010' amt='500.00' />
      </account>
    </accounts>
  </details>
</data>

使用Linq和XDocument,我可以提取“摘要”信息,但如何在“摘要”标签下提取“帐户”信息?

XDocument XMLDoc = XDocument.Load("testdata.xml");
XElement accounts = (from xml2 in XMLDoc.Descendants("summary")
                    select xml2).FirstOrDefault();

如何指定“summary/account”之类的内容,以便它返回<summary>下的所有元素?请注意,我在<account>下有<detail><accounts>,我只想要摘要标记下的元素。

3 个答案:

答案 0 :(得分:19)

您应该使用Elements方法:

var accounts = doc.Root.Elements("summary").Elements("account");

或者,XPathSelectElements,在这种情况下更简单:

var accounts = doc.XPathSelectElements("/data/summary/account");

在这种情况下,您也可以使用Descendants,正如Andrew Barber建议的那样,但一般情况下,只有在您真正想要查找具有给定名称的所有后代而不仅仅是直接子项时,才应该这样做。否则,您的代码会进行大量不需要的搜索,并且可能返回您不想要的元素。

答案 1 :(得分:3)

var accountSummaryElems = 
   XMLDoc.Element("summary").Elements("account");

这为您提供了account元素下的summary元素的集合。然后,您可以迭代它们以获取值。

编辑使用与您相同的模式;我拨打First()而不是FirstOrDefault(),因为如果找不到“account”元素,该代码将无法运行。

然后你有正确的想法迭代返回的集合。

答案 2 :(得分:0)

这将子元素作为字符串列表返回,无论它在哪里。

using System.Xml.Linq;
XDocument xmlDocument = XDocument.Load(fileName);


public List<string> FindChilds(string parentTag)
{
     return xmlDocument.Descendants().Where(x => x.Parent != null).Where(x => x.Parent.Name.ToString().Equals(parentTag)).Select(x => x.Name.ToString()).ToList();
}