【问题标题】:LINQ to XML pairing up two nodes inside XML document to a list or dictionaryLINQ to XML 将 XML 文档中的两个节点与列表或字典配对
【发布时间】:2017-04-11 10:12:15
【问题描述】:

我有一个基本上如下所示的 XML 文档:

<Item>
  <ItemID>1234567890</ItemID>
   <ItemSpecifics>
    <NameValueList>
      <Name>Style</Name>
      <Value>mens</Value>
    </NameValueList>
    <NameValueList>
      <Name>UPC</Name>
      <Value>123456789</Value>
    </NameValueList>
   </ItemSpecifics>
</Item>

并且“Item”节点在整个 XML 文档中重复出现,具有多个 ItemID 值和 UPC 值..

我想在这里做的是从每个 Item 节点中提取 ItemID 值,它是 UPC 值。所以输出将是这样的(包含列表或字典):

ItemID   UPC
1        598
2        2134
3        9999

等等..

我尝试过这样的事情:

var document = XDocument.Parse(xmlString);
var upcValues = document.Descendants("NameValueList")
                       .Where(pair => pair.Element("Name").Value == "UPC")
                       .Select(pair => pair.Element("Value").Value)
                       .DefaultIfEmpty("n/a");

但这并没有真正实现我想要的,因为我不确定如何从文档中同时提取 ID 和 UPC 值...

有人可以帮帮我吗?

【问题讨论】:

  • 请格式化 XML - 很难看到所有元素都在左侧排列的结构。
  • @JonSkeet 我很抱歉,我该怎么做?我以前从未在这里使用过 XML 格式 =( P.S. 我使用 ctrl + K 选项来格式化它
  • 嗯,你加空格。格式化 XML 与格式化代码没有什么不同。
  • @JonSkeet 现在好点了吗?
  • 好的,非常感谢。

标签: c# asp.net xml linq dictionary


【解决方案1】:

您需要以Item 开头,因为这是您最终想要的每个条目的根。您还需要提供元素的命名空间,默认在文档的根元素中。所以像:

XNamespace ns = "urn:ebay:apis:eBLBaseComponents";

var upcValues = document
    .Descendants(ns + "Item")
    .ToDictionary(
        item => (string) item.Element(ns + "ItemID"),
        item => (string) item.Elements(ns + "NameValueList")
                             .Single(nvl => (string) nvl.Element(ns + "Name") == "UPC")
                             .Element(ns + "Value"));

第一个 lambda 表达式从 ItemID 元素中选择字典元素中的键。第二个 lambda 表达式选择字典元素中的值,方法是找到唯一的 NameValueList 元素,其中 Name 元素的值为“NPC”,然后取该 NameValueListValue 元素值。

【讨论】:

  • @User987:没有完整的示例文档,很难知道哪里出了问题。也许有一个您没有向我们展示的默认命名空间? (这就是为什么在问题中包含minimal reproducible example 总是一个好主意。)
  • @User987:我的意思是一个完整的 XML 文档,它代表了您的实际文档——但是一个最小版本(例如两个项目)。我的猜测是根 XML 元素有 xmlns="..." 表示默认命名空间...
  • @User987:你以一种可怕的方式粘贴了它,就好像从浏览器中一样......它只显示了一个 Item 元素。您说您的实际文档有许多 Item 元素,这表明它不能是根元素。当您提供相互矛盾的信息时,真的很难提供帮助。
  • @User987: 对,既然您已经提供了实际 文档,问题就跟我想的一样。我将编辑我的答案。
  • @User987:是的,这确实会导致问题。 (这将是 UPC 之一。)但 Stack Overflow 并非旨在成为一种交互式调试服务。您应该单独研究该问题 - 您提出的问题并未表明可能没有 UPC 元素。
猜你喜欢
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多