使用C#将Linq用于XML,如何查找属性值?

时间:2014-11-11 09:15:52

标签: linq

我需要使用linq C#获取特定声明ID = 13的所有活动,我正在尝试以下代码,但它无效。

 XDocument Doc = XDocument.Load(DownloadedPath);
    var Activites = (from e in Doc.Descendants("Activity")
                  where (string)Doc.Element("Claim").Element("ID") == 13   
下面的

是Xml

<?xml version="1.0" encoding="utf-8"?>
<Advice>
  <Claim>
    <ID>12</ID>
    <ProviderID>CL-MC-0012-07</ProviderID>
    <Activity>
      <ID>20131520320</ID>
      <Start>24/07/2013 13:00</Start>
      <Type>3</Type>
    </Activity>
    <Activity>
      <ID>20131520321</ID>
      <Start>24/07/2013 13:00</Start>
      <Type>3</Type>
    </Activity>
  </Claim>
  <Claim>
    <ID>13</ID>
    <ProviderID>CL-MC-0012-07</ProviderID>
    <Activity>
      <ID>20132058590</ID>
      <Start>20/10/2013 09:00</Start>
      <Type>3</Type>
    </Activity>
    <Activity>
      <ID>20132058591</ID>
      <Start>20/10/2013 09:00</Start>
      <Type>3</Type>
    </Activity>
  </Claim>

1 个答案:

答案 0 :(得分:2)

您目前正在将该值转换为string,然后将其与int进行比较。不要这样做 - 它不会起作用:)。

将其转换为int可能最简单:

var Activites = (from e in Doc.Descendants("Activity")
                 where (int)Doc.Element("Claim").Element("ID") == 13   
                 ...)

接下来,查看您的XML - Claim元素不在Activity元素中...您可能只是想要:

var activities = doc.Descendants("Claim")
                    .Where(claim => (int) claim.Element("ID") == 13)
                    .SelectMany(claim => claim.Elements("Activity"));

这将找到ID为13的所有Claim元素(其中可能只有一个),然后使用SelectMany选择其活动,以便结果将是一系列活动元素而不是一系列序列...