【问题标题】:C# XML find first Element descendantsC# XML 查找第一个 Element 后代
【发布时间】:2016-11-10 18:09:02
【问题描述】:

寻找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

【问题讨论】:

  • 如果有多个项目,那么我假设没有属性可以区分它们?

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


【解决方案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 (?:) 以更优雅的方式检索 &lt;primaryCategory&gt;。请记住,如果您没有&lt;item&gt; 标记或&lt;primaryCategory&gt; 标记,则结果将等于null

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

【讨论】:

  • @monsey11 - 在你给定的真实 xml 和作品上进行了测试
  • 工作,谢谢吉拉德。 תודה רבה
  • 你的意思是?.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
  • 2013-12-30
  • 2019-08-12
  • 2012-06-11
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多