使用c#.net中的xelement获取空元素 让我们考虑下面的XML文档: <contact> <name>Hines</name> <phone>206-555-0144</phone> <mobile>425-555-0145</mobile> </contact>
如果“name”不存在,上面的代码将抛出一个使用c#.net中的xelement获取空元素 让我们考虑下面的XML文档: <contact> <name>Hines</name> <phone>206-555-0144</phone> <mobile>425-555-0145</mobile> </contact>,c#,.net,xml,linq-to-xml,xelement,C#,.net,Xml,Linq To Xml,Xelement,如果“name”不存在,上面的代码将抛出一个NullReferenceException,因为元素将在C#中返回null,但在vb.net中不返回null,而vb.net将抛出空值 因此,我的问题是确定根节点下的xml节点何时丢失,并获取一个空值。您可以创建一个易于重用的扩展方法。将其放置在静态类中 var value = parent.Element("name") != null ? parent.Element("name").Value : "" public static strin
NullReferenceException
,因为元素将在C#中返回null,但在vb.net中不返回null,而vb.net将抛出空值
因此,我的问题是确定根节点下的xml节点何时丢失,并获取一个空值。您可以创建一个易于重用的扩展方法。将其放置在静态类中
var value = parent.Element("name") != null ? parent.Element("name").Value : ""
public static string ElementValue(this XElement parent, string elementName)
{
var xel = parent.Element(elementName);
return xel == null ? "" : xel.Value;
}
现在你可以这样称呼它
string result = parent.ElementValue("name");
string result;
if (parent.TryGetValue("name", out result)) {
Console.WriteLine("Name = {0}", result);
}
更新 如果在元素不存在时返回
null
而不是空字符串,则可以区分空元素和不存在元素
public static string ElementValue(this XElement parent, string elementName)
{
var xel = parent.Element(elementName);
return xel == null ? null : xel.Value;
}
编辑 Microsoft在.NET Framework类库的不同位置使用以下模式
public static bool TryGetValue(this XElement parent, string elementName,
out string value)
{
var xel = parent.Element(elementName);
if (xel == null) {
value = null;
return false;
}
value = xel.Value;
return true;
}
可以这样叫
string result = parent.ElementValue("name");
string result;
if (parent.TryGetValue("name", out result)) {
Console.WriteLine("Name = {0}", result);
}
更新 通过C#6.0(Visual Studio 2015),Microsoft引入了空传播操作符
?。
大大简化了操作:
var value = parent.Element("name")?.Value;
这将简单地将值设置为null,即使找不到元素
如果要返回除null
以外的另一个值,还可以将其与合并运算符??
:
var value = parent.Element("name")?.Value ?? "";
只需将元素强制转换为可为null的类型。XElement有一个将元素值强制转换为所需类型的值:
string value = (string)parent.Element("name");
在这种情况下,如果找不到元素
,您将得到值等于null
的字符串NullReferenceException将不会引发
我认为,如果xml中不存在元素,那么null
是该元素唯一合适的值。但如果确实需要使用空字符串,则:
string value = (string)parent.Element("name") ?? "";
谢谢,如果真值或元素存在,我如何以布尔值表示感谢,如果不存在,我们的代码将返回null,如果存在,则返回value,我是对的+1。非常优雅的解决方案。这些铸件的唯一问题是intellisense没有显示它们的存在:-(@OlivierJacot Descombes,谢谢!是的,我花了一些时间来习惯元素和属性的铸造。但它真的很方便!