#c# #linq-to-xml
#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 amp;amp;
testResult.Attribute("ExecutionID").Value.Equals(executionID, StringComparison.CurrentCultureIgnoreCase) == true
select testResult.Attribute("Date").Value).FirstOrDefault();
}
catch (Exception ex)
{
resultType = ex.ToString();
}
return resultType;
}
Комментарии:
1. Было бы неплохо опубликовать исключение, кроме того, разве equals не возвращает bool? Почему у вас == true в конце?
2. Я получаю сообщение «Ссылка на объект не установлена для экземпляра объекта». Я использую «== true», чтобы проверить, равен ли executionId идентификатору выполнения из параметра
3. Проверьте, имеет ли
xmlDoc
значение null, либо путем отладки, либо добавлениемif (xmlDoc == null) return "document null";
4. xmldoc не является null…it содержит «загруженный» XML-файл. Я выполнил быстрое наблюдение, чтобы проверить это.
5. @SourabhTewari Тебе не нужно сравнивать. Равно (..) значению true..
Ответ №1:
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
Ответ №2:
В дополнение к ответу @Henk Holterman — просто улучшение :
var resultType = (from testResult in xmlDoc.Root.Descendants("ROW")
where testResult.Attribute("ExecutionID") != null amp;amp; testResult.Attribute("ExecutionID").Value.Equals(executionID, StringComparison.CurrentCultureIgnoreCase)
select testResult.Attribute("Date").Value).FirstOrDefault();
Я бы написал свой запрос следующим образом, потому что он учитывает элемент без executionId, а также == true не требуется. Equals возвращает bool так почему вы сравниваете его с true? Вообще без причины.