让我们考虑下面的xml文档:
<contact>
<name>Hines</name>
<phone>206-555-0144</phone>
<mobile>425-555-0145</mobile>
</contact>
从中检索一个值,如下所示
var value = parent.Element("name").Value;
如果“NullReferenceException
”不存在,上面的代码将抛出一个名称,因为元素在C#中将返回null,但在vb.net中不会返回空值。
因此,我的问题是确定根节点下的xml节点何时丢失,并获得一个空值。
发布于 2012-11-14 12:52:03
您可以创建一个易于重用的扩展方法。将其放在静态类中
public static string ElementValue(this XElement parent, string elementName)
{
var xel = parent.Element(elementName);
return xel == null ? "" : xel.Value;
}
现在你可以这样叫它
string result = parent.ElementValue("name");
更新
如果在元素不存在时返回null
而不是空字符串,则可以区分空元素和不存在元素。
public static string ElementValue(this XElement parent, string elementName)
{
var xel = parent.Element(elementName);
return xel == null ? null : xel.Value;
}
string result = parent.ElementValue("name");
if (result == null) {
Console.WriteLine("Element 'name' is missing!");
} else {
Console.WriteLine("Name = {0}", result);
}
编辑
微软在.NET框架类库的不同位置使用了以下模式
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;
if (parent.TryGetValue("name", out result)) {
Console.WriteLine("Name = {0}", result);
}
更新
在C# 6.0 (Visual Studio2015)中,微软引入了空传播运算符?.
,大大简化了事情:
var value = parent.Element("name")?.Value;
这将简单地将该值设置为null,即使没有找到该元素。
如果要返回null
以外的其他值,还可以将其与合并运算符??
结合使用
var value = parent.Element("name")?.Value ?? "";
发布于 2012-11-14 12:52:59
只需将您的元素转换为某个可以为空的类型。XElement有一个bunch of overloaded explicit casting operators,它会将元素值转换为所需的类型:
string value = (string)parent.Element("name");
在这种情况下,如果找不到元素<name>
,您将得到值等于null
的字符串。NullReferenceException将不会被引发。
我认为如果元素不存在于xml中,那么null
是该元素唯一合适的值。但是,如果您确实需要使用空字符串,那么:
string value = (string)parent.Element("name") ?? "";
发布于 2012-11-14 12:46:09
var value = parent.Element("name") != null ? parent.Element("name").Value : ""
https://stackoverflow.com/questions/13379061
复制相似问题