我有一个看起来像这样的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>
我的目标是:找到所有独特的coverageCodes
我有以下LINQ代码:
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);
}
第一个<item>
正确输出。但是,当它到达第二个<item>
时,它会引发错误Object reference not set to an instance of an object
,因为它在productCode
节点中寻找coverageCode
和coverageOptions/item
,但没有。
我不希望它看到那里。
我怎样才能让LINQ专注于第一个<item>
呢?我也希望productCode和coverageCode是截然不同的。在此XML文件中,有多个<item>
具有相同的productCode和coverageCode节点。
非常感谢你!
答案 0 :(得分:3)
如何让LINQ专注于第一个
<item>
?
我假设您不只是想要第一个<item>
,而是每个顶级<item>
。只需将Descendants("item")
更改为Elements("item")
即可。这样,它只会查找premiums
的立即子项,而不是所有后代元素。
对于不同的部分,您应该只能使用linq.Distinct()
。匿名类型适当地实现相等和哈希码生成。 (它只会查找不同的组合,请注意 - 如果您有两个具有相同产品代码但覆盖代码不同的项目,例如,它们仍将被视为不同。)