首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在c# .net中使用xelement获取空元素

在c# .net中使用xelement获取空元素
EN

Stack Overflow用户
提问于 2012-11-14 20:44:47
回答 3查看 5.3K关注 0票数 0

让我们考虑下面的xml文档:

代码语言:javascript
代码运行次数:0
运行
复制
<contact>
    <name>Hines</name>
    <phone>206-555-0144</phone>
    <mobile>425-555-0145</mobile>
</contact>

从中检索一个值,如下所示

代码语言:javascript
代码运行次数:0
运行
复制
var value = parent.Element("name").Value;

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

因此,我的问题是确定根节点下的xml节点何时丢失,并获得一个空值。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-14 20:52:03

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

代码语言:javascript
代码运行次数:0
运行
复制
public static string ElementValue(this XElement parent, string elementName)
{
    var xel = parent.Element(elementName);
    return xel == null ? "" : xel.Value;
}

现在你可以这样叫它

代码语言:javascript
代码运行次数:0
运行
复制
string result = parent.ElementValue("name");

更新

如果在元素不存在时返回null而不是空字符串,则可以区分空元素和不存在元素。

代码语言:javascript
代码运行次数:0
运行
复制
public static string ElementValue(this XElement parent, string elementName)
{
    var xel = parent.Element(elementName);
    return xel == null ? null : xel.Value;
}
代码语言:javascript
代码运行次数:0
运行
复制
string result = parent.ElementValue("name");
if (result == null) {
    Console.WriteLine("Element 'name' is missing!");
} else {
    Console.WriteLine("Name = {0}", result);
}

编辑

微软在.NET框架类库的不同位置使用了以下模式

代码语言:javascript
代码运行次数:0
运行
复制
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;
}

它可以这样命名。

代码语言:javascript
代码运行次数:0
运行
复制
string result;
if (parent.TryGetValue("name", out result)) {
    Console.WriteLine("Name = {0}", result);
}

更新

在C# 6.0 (Visual Studio2015)中,微软引入了空传播运算符?.,大大简化了事情:

代码语言:javascript
代码运行次数:0
运行
复制
var value = parent.Element("name")?.Value;

这将简单地将该值设置为null,即使没有找到该元素。

如果要返回null以外的其他值,还可以将其与合并运算符??结合使用

代码语言:javascript
代码运行次数:0
运行
复制
var value = parent.Element("name")?.Value ?? "";
票数 6
EN

Stack Overflow用户

发布于 2012-11-14 20:52:59

只需将您的元素转换为某个可以为空的类型。XElement有一个bunch of overloaded explicit casting operators,它会将元素值转换为所需的类型:

代码语言:javascript
代码运行次数:0
运行
复制
string value = (string)parent.Element("name");

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

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

代码语言:javascript
代码运行次数:0
运行
复制
string value = (string)parent.Element("name") ?? "";
票数 4
EN

Stack Overflow用户

发布于 2012-11-14 20:46:09

代码语言:javascript
代码运行次数:0
运行
复制
var value = parent.Element("name") != null ? parent.Element("name").Value : ""
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13379061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档