C# 通过LINQ读取特定的XML节点集

C# 通过LINQ读取特定的XML节点集,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,我有一个XML文件,看起来像这样 <return> <availableOptions> <premiums> <item> <productCode>Poroduct Code 1</productCode> <productDescription>Product Desc 1</productDescription> <

我有一个XML文件,看起来像这样

<return>
  <availableOptions>
    <premiums>
      <item>
        <productCode>Poroduct Code 1</productCode>
        <productDescription>Product Desc 1</productDescription>
        <coverageCode>Coverage Code 1</coverageCode>
        <coverageDescription>Coverage Description 1</coverageDescription>
      </item>
      <item>
        <productCode>Poroduct Code 2</productCode>
        <productDescription>Product Desc 2</productDescription>
        <coverageCode>Coverage Code 2</coverageCode>
        <coverageDescription>Coverage Description 2</coverageDescription>
        <coverageOptions>
          <item>
            <label>label here</label>
            <value>true</value>
            <key>key</key>
          </item>
          <item>
            <label>label here</label>
            <value>true</value>
            <key>key</key>
          </item>
        </coverageOptions>
        <surcharges/>
      </item>
      <item>
         etc...
      </item>
      <item>
         etc...
      </item>
    </premiums>
  </availableOptions>
</return>
第一个
输出正确。但是,当它到达第二个
时,会抛出一个错误
对象引用,该引用未设置为对象的实例
,因为它正在
coverageOptions/item
节点中查找
productCode
coverageCode
,但没有

我不想让它看那里

如何让LINQ只关注第一个
?我还希望productCode和coverageCode是不同的。在此XML文件中,有多个
具有相同的productCode和coverageCode节点

提前非常感谢

如何让LINQ只关注第一个

我假设您不只是想要第一个
,而是想要每个顶级
。只需将
子体(“项”)
更改为
元素(“项”)
。这样,它将只查找
premium
的直接子元素,而不是所有子元素

对于distinct部分,您应该能够只使用
linq.distinct()
。匿名类型适当地实现相等和哈希代码生成。(请注意,它只会寻找不同的组合——例如,如果您有两个产品代码相同但覆盖范围代码不同的项目,它们仍然会被视为不同的。)

如何让LINQ只关注第一个

我假设您不只是想要第一个
,而是想要每个顶级
。只需将
子体(“项”)
更改为
元素(“项”)
。这样,它将只查找
premium
的直接子元素,而不是所有子元素

对于distinct部分,您应该能够只使用
linq.distinct()
。匿名类型适当地实现相等和哈希代码生成。(请注意,它只会寻找不同的组合——例如,如果您有两个产品代码相同但覆盖范围代码不同的项目,它们仍然会被视为不同的。)

如何让LINQ只关注第一个

我假设您不只是想要第一个
,而是想要每个顶级
。只需将
子体(“项”)
更改为
元素(“项”)
。这样,它将只查找
premium
的直接子元素,而不是所有子元素

对于distinct部分,您应该能够只使用
linq.distinct()
。匿名类型适当地实现相等和哈希代码生成。(请注意,它只会寻找不同的组合——例如,如果您有两个产品代码相同但覆盖范围代码不同的项目,它们仍然会被视为不同的。)

如何让LINQ只关注第一个

我假设您不只是想要第一个
,而是想要每个顶级
。只需将
子体(“项”)
更改为
元素(“项”)
。这样,它将只查找
premium
的直接子元素,而不是所有子元素

对于distinct部分,您应该能够只使用
linq.distinct()
。匿名类型适当地实现相等和哈希代码生成。(请注意,它只会寻找不同的组合——例如,如果您有两个产品代码相同但覆盖范围代码不同的项目,它们仍然会被视为不同的。)

XDocument xdoc = XDocument.Load("data.xml");

var linq = from item in xdoc.Descendants("premiums").Descendants("item")
            select new
            {
                ProductCode = item.Element("productCode").Value,
                CoverageCode = item.Element("coverageCode").Value
            };

foreach (var node in linq)
{
    Console.WriteLine("Product Code: " + node.ProductCode + ", Coverage Code: " + node.CoverageCode);
}