【发布时间】: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>
当我尝试提取 LastName 和 FirstName 值时,我收到错误 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>();
在<Customer> 节点没有<LastName> 和<FirstName> 节点的情况下,我如何跳过它们,或者更好地甚至不首先选择它们?
【问题讨论】:
-
您可以在
.Select()之前添加.Where(x => x.Element("LastName") != null && x.Element("FirstName") != null) -
@dcg 你的意思是
.Where(x => x.Element("LastName") != null) -
@RandRandom 你说得对,我会编辑评论。谢谢。
-
而不是
LastName = x.Element("LastName").Value使用LastName = x.Element("LastName")?.Value,这将处理空引用对象,但它会导致CustomerModel带有一个空LastName,你不必照顾那个。 -
您也可以将查询更改为
xml.Descendants("CustomerList").Descendants("Customer").Where(x => x.HasElements).Select(xxxx);msdn.microsoft.com/en-us/library/…
标签: c# xml linq linq-to-xml