嵌套的XML元素抛出异常

时间:2015-06-30 03:20:32

标签: c# linq linq-to-xml

如何通过<StatusType>元素<Code>获得第一个状态是D.这个LINQ可以工作,但是很清楚地说x.Element("StatusType")可能是nullreferenceexpection。

var aaa = track.Descendants("Status")
     .SingleOrDefault(x => x.Element("StatusType") != null && 
                          x.Element("StatusType").Element("Code").Value == "D");

XML: -

<Activity>
<ActivityLocation>
<Address>
<City>WILSLLE</City>
<StateProvinceCode>oR</StateProvinceCode>
<PostalCode>978880</PostalCode>
<CountryCode>US</CountryCode>
</Address>
<Code>M7</Code>
<Description>RECEIVER</Description>
<SignedForByName>abc</SignedForByName>
</ActivityLocation>
<Status>
<StatusType>
<Code>D</Code>
<Description>DELIVERED</Description>
</StatusType>
<StatusCode>
<Code>KB</Code>
</StatusCode>
</Status>
<Date>20150504</Date>
<Time>085100</Time>
</Activity>
<Activity>
<ActivityLocation>
<Address>
<City>TUALATIN</City>
<StateProvinceCode>OR</StateProvinceCode>
<CountryCode>US</CountryCode>
</Address>
</ActivityLocation>
<Status>
<StatusType>
<Description>OUT FOR DELIVERY</Description>
</StatusType>
<StatusCode>
<Code>DS</Code>
</StatusCode>
</Status>
<Date>20150504</Date>
<Time>045600</Time>
</Activity>

1 个答案:

答案 0 :(得分:0)

您的代码存在的问题是某些StatusType节点本身不包含Code标记,因此它将返回null,.Value会抛出空引用异常。最好按以下方式对值进行类型转换,因为显式转换运算符比访问Value属性更安全,因为它首先检查null

var result = xdoc.Descendants("Status")
                 .SingleOrDefault(x => x.Element("StatusType") != null && 
                           (string)x.Element("StatusType").Element("Code") == "D");

此外,如果您非常确定您的过滤器查询仅返回1个节点,那么请使用SingleOrDefault,否则FirstOrDefault是更好的选择。