如果Element不存在

本文关键字:不存在 Element 如果 | 更新日期: 2023-09-27 18:04:16

我对此有十几种解决方案,但似乎没有一种适合我想做的。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;

在"contact"集合下,这里有许多名为"DataElement"的元素,每个元素都有自己的"QuestionName"answers"Answer"元素,所以我查询找到元素的QuestionName值为"other_phone"的元素,然后我得到答案值。当然,我需要对我正在寻找的每个值都这样做。

如果不存在,我如何编写此代码以忽略包含QuestionName值为"other_phone"的DataElement ?

如果Element不存在

您可以使用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");
}

所以你想知道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");
}