<?xml version="1.0" encoding="UTF-8"?>
<Pit>
<ROW ExecutionID="1366617710" Date="2011-11-09 00:04:04.303" AssertionName="Check for critical conditions" />
<ROW ExecutionID="1366619608" Date="2011-11-09 00:04:16.893" AssertionName="Check for critical conditions" />
</Pit>
我正在尝试根据某个executionID检索日期值。
我尝试使用以下查询,但我达到了“例外”。这很简单,但不知道为什么会失败。
异常消息为Object reference not set to an instance of an object.
public static string GetRowError(XDocument xmlDoc, string executionID)
{
string resultType = string.Empty;
try
{
resultType = (from testResult in xmlDoc.Elements("Pit")
where
testResult != null &&
testResult.Attribute("ExecutionID").Value.Equals(executionID, StringComparison.CurrentCultureIgnoreCase) == true
select testResult.Attribute("Date").Value).FirstOrDefault();
}
catch (Exception ex)
{
resultType = ex.ToString();
}
return resultType;
}
答案 0 :(得分:2)
xmlDoc.Elements("Pit")
将返回<Pit>
个元素,其余的逻辑假定它们是<ROW>
元素。
使用xmlDoc.Elements("Pit").Elements()
或直接选择xmlDoc.Descendants("ROW")
。
您的错误是由以下原因引起的:
var attr = xmlDoc.Elements("Pit").Attribute("ExecutionID"); // attr = null
var id = attr.Value; // error, attr == null
答案 1 :(得分:0)
除了@Henk Holterman的回答 - 只是一个改进:
var resultType = (from testResult in xmlDoc.Root.Descendants("ROW")
where testResult.Attribute("ExecutionID") != null && testResult.Attribute("ExecutionID").Value.Equals(executionID, StringComparison.CurrentCultureIgnoreCase)
select testResult.Attribute("Date").Value).FirstOrDefault();
我会像这样编写我的查询,因为它会占用没有executionID的元素,并且不需要== true。等于返回bool所以你为什么要将它与true进行比较?没有理由。