繁体   English   中英

C#XmlElement:SelectSingleNode为空字符串返回null?

[英]C# XmlElement: SelectSingleNode returns null for empty string?

我是C#的新手,刚开始使用XmlElement及其SelectSingleNode方法。 在我的XML文件中,有一个标签可能有一个值(即<tag>value</tag> )或为空(即<tag></tag> )。 如果它为空,则SelectSingleNode返回null。

我目前正在使用以下代码来捕获标记的值:

XmlElement elem = ....
string s = elem.SelectSingleNode("somepath").Value;

此代码显然会引发空标记的异常。 但是,对我来说,空标记是一个有效值,我希望我的字符串的值为“”。

用try ... catch包含对SelectSingleNode的每次调用似乎是代码的巨大浪费(我有许多字段可能是空的),我确信有更好的方法来实现这一点。

推荐的方法是什么?

编辑:

根据请求,示例XML代码将是:

<Elements>
    <Element>
        <Name>Value</Name>
        <Type>Value</Type> <-- may be empty
        <Color>Value</Color>
    </Element>
    <Element>
        <Name>Value</Name>
        <Type>Value</Type>
        <Color>Value</Color>
    </Element>
</Elements>

CS代码:

XmlDocument doc = new XmlDocument();
doc.Load("name.xml");

foreach (XmlElement elem in doc.SelectNodes("Elements/Element"))
{
    myvalue = elem.SelectSingleNode("Type/text()").Value;
}

您的示例代码:

  myvalue = elem.SelectSingleNode("Type/text()").Value;

是问题所在。 你在那里使用的XPath表达式并不意味着“给我元素Type文本”。 它意味着“给我所有元素类型的子文本节点”。 并且空元素没有任何子文本节点(XPath文档模型中的文本节点不能为空)。 如果要获取节点的文本值,则应使用:

  myvalue = elem.SelectSingleNode("Type").InnerText;

推荐的方法是使用.NET的新XML API(即LINQ to XML)。

这是一个例子:

using System;
using System.Linq;
using System.Xml.Linq;

class Program
{
    static void Main()
    {
        String xml = @"<Root><Value></Value></Root>";

        var elements = XDocument.Parse(xml)
            .Descendants("Value")
            .Select(e => e.Value);
    }
}

http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.value(VS.71).aspx

因为返回的“值”取决于NodeType,所以该节点有可能被解释为可以返回NULL的类型。

你可能最好使用:

XmlElement elem = ....
string s = elem.SelectSingleNode("somepath").InnerText;

因为XMLNode.InnerText (或XmlNode.InnerXML )将返回一个字符串,包括一个空字符串。

也许这对你有用:

string s = elem.SelectSingleNode("somepath") != null ? elem.SelectSingleNode("somepath").value : ""

当我真正困扰XML DOM时,您可以编写一个帮助方法:

static string NodeValue(XmlNode node, string defaultValue)
{
    if (node != null)
        return node.Value ?? defaultValue;

    return defaultValue;
}

如果您不确定您的节点是否存在,则可以执行以下操作:

string s = NodeValue(elem.SelectSingleNode("Type"), String.Empty);

如果保持代码可读,特别是如果您为多个元素执行此操作。

所有这一切是说,的SelectSingleNode(..)如果标记为空, 返回空值。 但是Value属性为null。 如果您只是想解决这个问题,那么应该这样做:

string s = elem.SelectSingleNode("Type").Value ?? String.Empty;

编辑:啊,您正在使用/ text()来选择实际的文本节点。 您可以摆脱XPath的那一部分,但我提供的NodeValue方法仍然可以工作(但在这种情况下不需要“?? defaultValue”部分)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM