У меня есть около дюжины решений для этого, но никто, кажется, не подходит к тому, что я пытаюсь сделать. Файл 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", если он не существует?
Значит, вы хотите знать, существует ли 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");
}
Вы можете использовать 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");
}