如何通过<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>
答案 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是更好的选择。