C# 通过LINQ读取特定的XML节点集
我有一个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> <
<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);
}