Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用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 - Fatal编程技术网

使用c#.net中的xelement获取空元素 让我们考虑下面的XML文档: <contact> <name>Hines</name> <phone>206-555-0144</phone> <mobile>425-555-0145</mobile> </contact>

使用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

如果“name”不存在,上面的代码将抛出一个
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,谢谢!是的,我花了一些时间来习惯元素和属性的铸造。但它真的很方便!