考虑以下xml片段:
<Obj>
<Name><![CDATA[SomeText]]></Name>
</Obj>
Run Code Online (Sandbox Code Playgroud)
如何通过XPath检索"SomeText"值?我正在使用Nauman Leghari(优秀的)Visual XPath工具.
/Obj/Name返回元素
/Obj/Name/text()返回空白
我不认为这个工具有问题(我可能错了) - 我也读过XPath无法提取CDATA(参见本帖中的最后一个回复) - 这对我来说听起来有点奇怪.
Gis*_*shu 22
/Obj/Name/text() 是返回CDATA标记内容的XPath.
让我失望的是Value属性的行为.对于XMLNode(DOM世界),Element的XmlNode.Value属性(带有CDATA或其他)返回Null.InnerText属性将为您提供CDATA/Text内容.如果使用Xml.Linq,则XElement.Value将返回CDATA内容.
string sXml = @"
<object>
<name><![CDATA[SomeText]]></name>
<name>OtherName</name>
</object>";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml( sXml );
XmlNamespaceManager nsMgr = new XmlNamespaceManager(xmlDoc.NameTable);
Console.WriteLine(@"XPath = /object/name" );
WriteNodesToConsole(xmlDoc.SelectNodes("/object/name", nsMgr));
Console.WriteLine(@"XPath = /object/name/text()" );
WriteNodesToConsole( xmlDoc.SelectNodes("/object/name/text()", nsMgr) );
Console.WriteLine(@"Xml.Linq = obRoot.Elements(""name"")");
XElement obRoot = XElement.Parse( sXml );
WriteNodesToConsole( obRoot.Elements("name") );
Run Code Online (Sandbox Code Playgroud)
输出:
XPath = /object/name
NodeType = Element
Value = <null>
OuterXml = <name><![CDATA[SomeText]]></name>
InnerXml = <![CDATA[SomeText]]>
InnerText = SomeText
NodeType = Element
Value = <null>
OuterXml = <name>OtherName</name>
InnerXml = OtherName
InnerText = OtherName
XPath = /object/name/text()
NodeType = CDATA
Value = SomeText
OuterXml = <![CDATA[SomeText]]>
InnerXml =
InnerText = SomeText
NodeType = Text
Value = OtherName
OuterXml = OtherName
InnerXml =
InnerText = OtherName
Xml.Linq = obRoot.Elements("name")
Value = SomeText
Value = OtherName
Run Code Online (Sandbox Code Playgroud)
原来,Visual XPath的作者有一个CDATA类型的XmlNodes的TODO.一个小代码片段,我现在有CDATA支持.
MainForm.cs
private void Xml2Tree( TreeNode tNode, XmlNode xNode)
{
...
case XmlNodeType.CDATA:
//MessageBox.Show("TODO: XmlNodeType.CDATA");
// Gishu
TreeNode cdataNode = new TreeNode("![CDATA[" + xNode.Value + "]]");
cdataNode.ForeColor = Color.Blue;
cdataNode.NodeFont = new Font("Tahoma", 12);
tNode.Nodes.Add(cdataNode);
//Gishu
break;
Run Code Online (Sandbox Code Playgroud)
Dim*_*hev 10
CDATA节只是什么部分的XPath被称为一个text node或XML信息的"字符信息项的块".
显然,你的工具是错误的.其他工具,因为XPath VisualizerName在评估此XPath表达式时正确突出显示该元素的文本:
/*/Name/text()
Run Code Online (Sandbox Code Playgroud)
还可以编写一个简单的XSLT转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
"<xsl:value-of select="/*/Name"/>"
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
在提供的XML文档上应用此转换时:
<Obj>
<Name><![CDATA[SomeText]]></Name>
</Obj>
Run Code Online (Sandbox Code Playgroud)
产生了正确的结果:
"SomeText"
Run Code Online (Sandbox Code Playgroud)