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