Если Элемент не существует

1

У меня есть около дюжины решений для этого, но никто, кажется, не подходит к тому, что я пытаюсь сделать. Файл XML содержит элементы, которые могут не быть в файле каждый раз, когда он отправлен.

Фокус в том, что запрос зависит от значения вопроса, чтобы получить значение ответа. Вот код:

string otherphone = (
    from e in contact.Descendants("DataElement")
    where e.Element("QuestionName").Value == "other_phone"
    select (string)e.Element("Answer").Value
).FirstOrDefault();
otherphone = (!String.IsNullOrEmpty(otherphone)) ? otherphone.Replace("'", "''") : null;

В коллекции "контакт" здесь много элементов с именем "DataElement", каждый со своими элементами "QuestionName" и "Answer", поэтому я запрашиваю, чтобы найти тот, где значение элемента QuestionName "other_phone", затем я получаю Значение ответа. Конечно, мне нужно будет сделать это для каждой ценности, которую я ищу.

Как я могу закодировать это, чтобы игнорировать DataElement, содержащий QuestionName со значением "other_phone", если он не существует?

Теги:
linq

2 ответа

0

Значит, вы хотите знать, существует ли other_phone?

XElement otherPhone = contact.Descendants("QuestionName")
    .FirstOrDefault(qn => ((string)qn) == "other_phone");

if (otherPhone == null)
{
   // No question with "other_phone"
}
else
{
    string answer = (string)otherPhone.Parent.Element("Answer");
}
0

Вы можете использовать Any метод для проверки наличия или отсутствия элементов:

if(contact.Descendants("DataElement")
     .Any(e => (string)e.Element("QuestionName") == "other_phone"))
{
   var otherPhone =  (string)contact
                   .Descendants("DataElement")
                   .First(e => (string)e.Element("QuestionName") == "other_phone")
                   .Element("Answer");
}

Кроме того, не используйте свойство Value если вы используете явное приведение. Точка явного броска исключает возможное исключение, если элемент не был найден. Если вы используете оба метода перед трансляцией, доступ к свойству Value вызовет исключение,

Кроме того, вы также можете просто использовать метод FirstOrDefault без Any и выполнить нуль-проверку:

var element =  contact
              .Descendants("DataElement")
              .FirstOrDefault(e => (string)e.Element("QuestionName") == "other_phone");

if(element != null)
{
    var otherPhone = (string)element.Element("Answer");
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню