[英]C#/XML: XPathNavigator.SelectSingleNode() always returns 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.