【问题标题】:what xpath to select CDATA content when some childs exist当某些孩子存在时选择 CDATA 内容的 xpath
【发布时间】:2013-11-13 17:49:39
【问题描述】:

假设我有一个如下所示的 XML:

<a>
  <b>
     <![CDATA[some text]]>
     <c>xxx</c>
     <d>yyy</d>
  </b>
</a>

我找不到获取“一些文本”的方法。有什么想法吗?

如果我使用 "a/b" 它还会返回 xxx 和 yyy 如果我使用 "a/b/text()" 它什么也不返回

【问题讨论】:

    标签: xpath cdata


    【解决方案1】:

    您实际上无法选择 CDATA 部分:CDATA 只是告诉解析器避免转义特殊字符的一种方式,您的输入文档看起来与 XPath 完全相同:

    <a>
      <b>
         some text
         <c>xxx</c>
         <d>yyy</d>
      </b>
    </a>
    

    (话虽如此,如果您使用的是 DOM,则某些 DOM XPath 引擎无法正确实现规范,并将 CDATA 内容视为与 CDATA 部分之外的文本分开的文本节点。

    XPath 表达式 a/b/text() 应该选择三个文本节点,其中第一个包含“一些文本”以及周围的空白。

    【讨论】:

    • 好的,所以基本上无论出于何种原因,当 CDATA 是内部节点的一部分并且不返回任何内容时,text() 都会有点混乱。看起来处理这个问题的唯一正确方法(并且在任何 xpath 引擎上都是健壮的)是添加一个特定的节点来包含 CDATA 部分然后......谢谢!
    【解决方案2】:

    对于 XPath 数据模型,路径 /a/b/text()[1] 应该选择带有字符串值的文本节点

    一些文字

    那是一个换行符,一些空格,文本some text后跟一个换行符和一些空格。

    【讨论】:

    • 嗯...我不确定孩子的顺序是否一定是已知的,所以我不能确定 CDATA 部分在第一个位置...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 2015-10-31
    • 1970-01-01
    相关资源
    最近更新 更多