C#XML找到第一个Element后代

时间:2016-11-10 18:09:03

标签: c# xml linq linq-to-xml xelement

希望首先找到categoryIdcategoryName item。 它也可以不返回产品。

XML看起来像这样

<findItemsByKeywordsResponse xmlns="http://...">
   <ack>Success</ack>
   <version>1.13.0</version>
   <timestamp>2016-11-10T17:48:21.321Z</timestamp>
   <searchResult count="1">
      <item>
        <itemId>12354</itemId>
        <title>ABCD#</title>
        <globalId>ddd</globalId>
        <primaryCategory>
          <categoryId>**1234**</categoryId>
          <categoryName>**Catg Nameee**</categoryName>
        </primaryCategory>
      </item>
   </searchResult>
   <paginationOutput>
   </paginationOutput>
</findItemsByKeywordsResponse>   

完整xml here

1 个答案:

答案 0 :(得分:1)

因为您的根元素定义了一个名称空间,所以在搜索后代项时应该执行的操作是指定名称空间:

XNamespace ns = @"http://www.ebay.com/marketplace/search/v1/services";
var result = XDocument.Load("data.xml")
          .Descendants(ns + "item")
          .FirstOrDefault()?.Element(ns + "primaryCategory");

var categoryId = result?.Element(ns + "categoryId")?.Value;
var categoryName = result?.Element(ns + "categoryName")?.Value;

您还可以使用C#6.0 Null Propagation(?:)以更优雅的方式检索<primaryCategory>。请注意,如果您没有<item>代码或<primaryCategory>代码,则结果将等于null

此外,尝试找到回答某些谓词的第一个<item>可能更有意义。如果是这种情况,请更改.FirstOrDefault(): 例如.FirstOrDefault(item => item.Element("itemId").Value == "12345")