我是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;
}
答案 0 :(得分:10)
您的示例代码:
myvalue = elem.SelectSingleNode("Type/text()").Value;
是问题所在。你在那里使用的XPath表达式并不意味着“给我元素Type
的文本”。它意味着“给我所有元素类型的子文本节点”。并且空元素没有任何子文本节点(XPath文档模型中的文本节点不能为空)。如果要获取节点的文本值,则应使用:
myvalue = elem.SelectSingleNode("Type").InnerText;
答案 1 :(得分:1)
推荐的方法是使用.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);
}
}
答案 2 :(得分:1)
http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.value(VS.71).aspx
由于返回的“value”取决于NodeType,因此该节点有可能被解释为可返回NULL的类型。
您可能最好使用:
XmlElement elem = ....
string s = elem.SelectSingleNode("somepath").InnerText;
因为XMLNode.InnerText(或XmlNode.InnerXML)将返回一个字符串,包括一个空字符串。
答案 3 :(得分:0)
也许这对你有用:
string s = elem.SelectSingleNode("somepath") != null ? elem.SelectSingleNode("somepath").value : ""
答案 4 :(得分:0)
当我真的在烦扰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”部分)。