0

让我们考虑以下 xml 文档:

<contact>
    <name>Hines</name>
    <phone>206-555-0144</phone>
    <mobile>425-555-0145</mobile>
</contact>

我从中检索一个值

var value = parent.Element("name").Value;

NullReferenceException如果“名称”不存在,上面的代码将抛出一个错误,因为 Element 在 C# 中将返回 null 而在 vb.net 中则不会,这将抛出空值。

所以我的问题是确定根节点下方的 xml 节点何时丢失并取而代之的是一个空值。

4

3 回答 3

6

您可以创建一个可以轻松重用的扩展方法。将其放在静态类中

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);
}

编辑

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;
if (parent.TryGetValue("name", out result)) {
    Console.WriteLine("Name = {0}", result);
}

更新

在 C# 6.0 (Visual Studio 2015) 中,Microsoft 引入了 null 传播运算符,?.大大简化了事情:

var value = parent.Element("name")?.Value;

即使未找到该元素,这也会简单地将值设置为 null。

??如果你想返回另一个值,你也可以将它与 coalesce 运算符结合使用null

var value = parent.Element("name")?.Value ?? "";
于 2012-11-14T12:52:03.293 回答
4

只需将您的元素转换为一些可为空的类型。XElement 有一堆重载的显式转换运算符,它们会将元素值转换为所需的类型:

string value = (string)parent.Element("name");

在这种情况下,如果找不到元素<name>,您将获得值等于 的字符串null不会引发 NullReferenceException

我认为如果元素在 xml 中不存在,那么null是该元素唯一合适的值。但是,如果您确实需要使用空字符串,那么:

string value = (string)parent.Element("name") ?? "";
于 2012-11-14T12:52:58.860 回答
0
var value = parent.Element("name") != null ? parent.Element("name").Value : ""
于 2012-11-14T12:46:09.263 回答