0

我有一个看起来像这样的 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寻找productCodeand ,但没有。 coverageCodecoverageOptions/item

不想让它看起来在那里。

我怎样才能让 LINQ 只关注第一个<item>呢?我也希望 productCode 和 coverageCode 是不同的。在此 XML 文件中,有多个<item>具有相同 productCode 和 coverageCode 节点。

非常感谢您!

4

1 回答 1

3

我怎样才能让 LINQ 只关注第一个<item>呢?

我假设您不仅想要第一个<item>,还想要每个顶级<item>。只需更改Descendants("item")Elements("item"). 这样它只会寻找直接的孩子premiums而不是所有的后代元素。

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

于 2013-11-12T15:59:34.157 回答