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

Sri*_*ddy 9 .net c# 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>
Run Code Online (Sandbox Code Playgroud)

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

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

如何指定像" summary/account"这样的东西,以便它返回下面的所有元素<summary>?请注意,我有<account><detail><accounts>,我只希望在总结标签的元素.

编辑:(安德鲁的解决方案)

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

Rob*_*ney 20

你应该使用这个Elements方法:

var accounts = doc.Root.Elements("summary").Elements("account");
Run Code Online (Sandbox Code Playgroud)

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

var accounts = doc.XPathSelectElements("/data/summary/account");
Run Code Online (Sandbox Code Playgroud)

在这种情况下,你也可以使用Descendants,如安德鲁·巴伯建议,但一般你应该只做到这一点,当你真的想找到一个给定的名称的所有后代,而不仅仅是眼前的孩子.否则,您的代码会进行大量不需要的搜索,并且可能会返回您不希望它的元素.