Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过XPath检索CDATA标记中的元素文本?_Xpath - Fatal编程技术网

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

如何通过XPath检索CDATA标记中的元素文本?,xpath,Xpath,考虑以下xml片段: <Obj> <Name><![CDATA[SomeText]]></Name> </Obj> 如何通过XPath检索“SomeText”值?我用的是Nauman Leghari的(非常好)。 /Obj/Name返回元素 /Obj/Name/text()返回空白 我不认为这是工具的问题(我可能错了)-我还读到XPath无法提取CDATA(请参阅最后的响应)-这听起来有点奇怪。我认为您引用的线程说XPath

考虑以下xml片段:

<Obj>
   <Name><![CDATA[SomeText]]></Name>
</Obj>

如何通过XPath检索“SomeText”值?我用的是Nauman Leghari的(非常好)。
/Obj/Name
返回元素
/Obj/Name/text()
返回空白


我不认为这是工具的问题(我可能错了)-我还读到XPath无法提取CDATA(请参阅最后的响应)-这听起来有点奇怪。

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

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

看看这是否有帮助-

XPATH=/Obj/Name/text()

显然,您的工具是错误的。其他工具,如在计算此XPath表达式时正确突出显示
Name
元素的文本:

/*/Name/text()
还可以编写一个简单的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>
<Obj>
    <Name><![CDATA[SomeText]]></Name>
</Obj>
/Obj/Name/text()
是返回CDATA标记内容的XPath

让我不舒服的是Value属性的行为。对于XMLNode(DOM世界),元素的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") );

建议使用cdata的md5散列的另一个字段。然后可以使用xpath根据md5进行查询,而不会出现任何问题

<sites>
  <site>
    <name>Google</name>
    <url><![CDATA[http://www.google.com]]></url>
    <urlMD5>ed646a3334ca891fd3467db131372140</urlMD5>
  </site>
</sites>

>您看到的Value属性的行为是不同API反映的不同数据模型的效果。许多API遵循XMLInfoset,它区分文本和CData内容。但是XPath没有。NET的XPathDocument API遵循XPath模型,因此您无法显式地查看CDATA,它基本上在XMLNode类型上有一个巨大的DisplayNode()开关盒。。。对于包含TODO的特定案例块:),请使用它所在的工具解决问题。如果xpath表示法允许直接搜索相关节点,则不需要此:-)
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
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;
<sites>
  <site>
    <name>Google</name>
    <url><![CDATA[http://www.google.com]]></url>
    <urlMD5>ed646a3334ca891fd3467db131372140</urlMD5>
  </site>
</sites>
/sites/site[urlMD5=ed646a3334ca891fd3467db131372140]