需要找到属性值

时间:2011-11-09 09:16:17

标签: c# linq-to-xml

<?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;
}

2 个答案:

答案 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进行比较?没有理由。