【问题标题】:how to use XPath to find the node value with CDATA tag in javajava中如何使用XPath查找带有CDATA标签的节点值
【发布时间】:2011-12-24 03:32:39
【问题描述】:

我用XPath解析rss xml数据,数据是

<rss version="2.0">
  <channel>
    <title>
      <![CDATA[sports news]]>
    </title>
  </channel>
</rss>  

我想用xpath "/rss/channel/title/text()" 得到文本"sports news",但是结果不是我想要的,真正的结果是"\r\n",那么如何找到我想要的结果。

代码如下:

文档 doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is); XPathFactory xpathFactory = XPathFactory.newInstance(); XPath xPath = xpathFactory.newXPath(); 节点 node = (Node) xPath.evaluate("/rss/channel/title/text()", doc,XPathConstants.NODE); 字符串标题 = node.getNodeValue();

【问题讨论】:

    标签: java xml xpath


    【解决方案1】:

    尝试在 DocumentBuilderFactory 上调用 setCoalescing(true),这会将所有 CDATA/文本节点折叠成单个节点。

    【讨论】:

    • 或传递 XPathConstants.NODESET,并将评估分配给 NodeList。但是合并是更容易的事情。
    • 正式地,在 XPath 数据模型中,文本节点永远不会被分割成小块,因此您的查询应该返回您期望的结果。在实践中,一些在 DOM 上工作的 XPath 实现将无法连接相邻的文本节点。一种解决方案是避免使用 text() (在元素上使用 string() 代替);另一种是按照建议使用 setCoalescing() ;第三种是使用符合标准的 XPath 处理器,例如 Saxon。
    【解决方案2】:

    您可以尝试将 XPath 表达式更改为

    "string(/rss/channel/title)"
    

    并使用返回类型 STRING 而不是 NODE:

    Node node = (Node) xPath.evaluate("string(/rss/channel/title)", doc,
                                      XPathConstants.STRING);
    

    这样您选择的不是文本节点,而是标题元素的字符串值,它由其所有后代文本节点的串联组成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      • 2018-01-13
      • 2011-08-24
      相关资源
      最近更新 更多