Нужно найти значение атрибута - PullRequest
1 голос
/ 09 ноября 2011
<?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>

Я пытаюсь получить значение даты на основе определенного идентификатора выполнения.

Я пытался использовать приведенный ниже запрос, но достиг "исключения".Это довольно просто, но не знаю, почему это не получается.

Сообщение об исключении: 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 ]

2 голосов
/ 09 ноября 2011
xmlDoc.Elements("Pit")

вернет элементы <Pit>, а остальная часть вашей логики предполагает, что они <ROW>.

Либо используйте xmlDoc.Elements("Pit").Elements(), либо выберите xmlDoc.Descendants("ROW").

* 1009.* Ваша ошибка вызвана:
var attr = xmlDoc.Elements("Pit").Attribute("ExecutionID");  // attr = null
var id = attr.Value;  // error, attr == null
0 голосов
/ 09 ноября 2011

В дополнение к ответу @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();

Я бы написал свой запрос так, потому что он учитывает элемент без executeID, а также == true не требуется.Равно возвращает bool, так почему вы сравниваете это с истиной?Нет причин вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...