【问题标题】:Parsing XML that is missing expected child nodes解析缺少预期子节点的 XML
【发布时间】:2017-10-25 14:26:51
【问题描述】:

我正在使用 LINQ to XML 解析 XML 片段,我发现我选择的节点之一缺少我期望的子节点。

示例 XML

<CustomerList>
  <Customer>
    <LastName>Smith</LastName>
    <FirstName>Todd</FirstName>
  </Customer>
  <Customer>
    <LastName>Jones</LastName>
    <FirstName>Fred</FirstName>
  </Customer>
  <Customer>Tom Jones</Customer> <!-- Missing child nodes -->
</CustomerList>

当我尝试提取 LastNameFirstName 值时,我收到错误 Object reference not set to an instance of an object.

使用 LINQ 解析 XML

XDocument xml = XDocument.Parse(xmlResponse);
List<CustomerModel> nodeList = xml.Descendants("CustomerList")
                          .Descendants("Customer")
                          .Select(x => new CustomerModel
                          {
                            LastName = x.Element("LastName").Value,
                            FirstName = x.Element("FirstName").Value,
                          }).ToList<CustomerModel>();

&lt;Customer&gt; 节点没有&lt;LastName&gt;&lt;FirstName&gt; 节点的情况下,我如何跳过它们,或者更好地甚至不首先选择它们?

【问题讨论】:

  • 您可以在.Select() 之前添加.Where(x =&gt; x.Element("LastName") != null &amp;&amp; x.Element("FirstName") != null)
  • @dcg 你的意思是.Where(x =&gt; x.Element("LastName") != null)
  • @RandRandom 你说得对,我会编辑评论。谢谢。
  • 而不是LastName = x.Element("LastName").Value 使用LastName = x.Element("LastName")?.Value, 这将处理空引用对象,但它会导致CustomerModel 带有一个空LastName,你不必照顾那个。
  • 您也可以将查询更改为xml.Descendants("CustomerList").Descendants("Customer").Where(x =&gt; x.HasElements).Select(xxxx);msdn.microsoft.com/en-us/library/…

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


【解决方案1】:

我的建议是:

XDocument xml = XDocument.Parse(xmlResponse);
List<CustomerModel> nodeList = xml.Descendants("CustomerList")
                      .Descendants("Customer")
                      .Where(x => x.Element("LastName") != null && x.Element("FirstName") != null)
                      .Select(x => new CustomerModel
                      {
                        LastName = x.Element("LastName").Value,
                        FirstName = x.Element("FirstName").Value,
                      }).ToList<CustomerModel>();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多