C# XML 查找第一个元素后代

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

寻找第一个 itemcategoryIdcategoryName。 它也可以不返回任何产品。

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

最佳答案

因为您的根元素定义了一个 namespace ,所以在搜索后代项时您应该做的是指定 namespace :

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 空值传播 (?:) 检索 <primaryCategory>以更优雅的方式。请记住,如果您没有 <item>标签或 <primaryCategory>标记结果将等于 null

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

关于C# XML 查找第一个元素后代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40534305/

相关文章:

C# 相等运算符覆盖(== 和 !=)

c# - 在 SQL Server 中批量插入特定列

c# - OrderByDescending 在 Linq 中无法正常工作

c# - Linux 上的单实例 dotnetcore cli 应用程序

c# - foreach 获取下一个项目

c# - 为 RSS 加载 XDocument 时出现 MonoDroid ObjectDisposedException

java.lang.ClassCastException,无法转换 DeepNodeListImpl

PHP - 来自指定标签的 xml 数据作为 sql 条目

c# - 如何在 C# 中将多个函数作为约束参数传递?

c# - LINQ to XML - 如何从匿名对象获取字典?