代码之家  ›  专栏  ›  技术社区  ›  Roee Adler

C xmlement:selectsinglenode为空字符串返回空值?

  •  6
  • Roee Adler  · 技术社区  · 16 年前

    我是C_的新手,刚开始使用xmlement及其selectsinglenode方法。在我的XML文件中,有一个标记可能有一个值(即 <tag>value</tag> )或者是空的(即 <tag></tag> )如果为空,则selectsinglenode返回空值。

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

    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;
    }
    
    5 回复  |  直到 13 年前
        1
  •  10
  •   Pavel Minaev    16 年前

    您的示例代码:

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

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

      myvalue = elem.SelectSingleNode("Type").InnerText;
    
        2
  •  1
  •   Andrew Hare    16 年前

    建议的方法是使用.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);
        }
    }
    
        3
  •  1
  •   Paige Watson    16 年前

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

    因为返回的“value”取决于nodeType,所以有可能将节点解释为可以返回空值的类型。

    你最好使用:

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

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

        4
  •  0
  •   tessa    16 年前

    也许这对你有用:

    string s = elem.SelectSingleNode("somepath") != null ? elem.SelectSingleNode("somepath").value : ""
    
        5
  •  0
  •   Thorarin    16 年前

    当我真正关心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(..)就是这样做的。 如果标记为空,则返回空值。这个 价值 但是,属性将为空。如果你只是想解决这个问题,应该做到:

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

    编辑: 啊,您使用/text()来选择实际的文本节点。您可以去掉XPath的那部分,但我提供的nodeValue方法仍然可以工作(是吗?)?在这种情况下,不需要“默认值”部分)。