簡體   English   中英

LINQ to XML將XML文檔中的兩個節點配對到一個列表或字典

[英]LINQ to XML pairing up two nodes inside XML document to a list or dictionary

我有一個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值。

有人可以幫我嗎 ?

您需要從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元素中選擇dictionary元素中的鍵。 第二個lambda表達式通過查找唯一的NameValueList元素和一個Name值為“ NPC”的NameValueList元素來選擇字典元素中的值,然后采用該NameValueListValue元素值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM