簡體   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