当前位置:  开发笔记 > Android > 正文

如何通过XPath检索CDATA标记内的元素文本?

如何解决《如何通过XPath检索CDATA标记内的元素文本?》经验,为你挑选了3个好方法。

考虑以下xml片段:


   

如何通过XPath检索"SomeText"值?我正在使用Nauman Leghari(优秀的)Visual XPath工具.
/Obj/Name返回元素
/Obj/Name/text()返回空白

我不认为这个工具有问题(我可能错了) - 我也读过XPath无法提取CDATA(参见本帖中的最后一个回复) - 这对我来说听起来有点奇怪.



1> Gishu..:

/Obj/Name/text() 是返回CDATA标记内容的XPath.

让我失望的是Value属性的行为.对于XMLNode(DOM世界),Element的XmlNode.Value属性(带有CDATA或其他)返回Null.InnerText属性将为您提供CDATA/Text内容.如果使用Xml.Linq,则XElement.Value将返回CDATA内容.

string sXml = @"

    
    OtherName
";

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") );

输出:

XPath = /object/name
        NodeType = Element
        Value = 
        OuterXml = 
        InnerXml = 
        InnerText = SomeText

        NodeType = Element
        Value = 
        OuterXml = OtherName
        InnerXml = OtherName
        InnerText = OtherName

XPath = /object/name/text()
        NodeType = CDATA
        Value = SomeText
        OuterXml = 
        InnerXml =
        InnerText = SomeText

        NodeType = Text
        Value = OtherName
        OuterXml = OtherName
        InnerXml =
        InnerText = OtherName

Xml.Linq = obRoot.Elements("name")
        Value = SomeText
        Value = OtherName

原来,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;



2> Dimitre Nova..:

CDATA节只是什么部分的XPath被称为一个text node或XML信息的"字符信息项的块".

显然,你的工具是错误的.其他工具,因为XPath VisualizerName在评估此XPath表达式时正确突出显示该元素的文本:

/*/Name/text()

还可以编写一个简单的XSLT转换:


 

  ""


在提供的XML文档上应用此转换时:


    

产生了正确的结果:

  "SomeText"



3> Jason..:

我认为您引用的线程表示CDATH忽略了CDATA标记本身,而不是CDATA标记中包含的文本.

我的猜测是它的工具有问题,源代码可以下载,也许你可以调试它...

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有