是否有一个XPath表达式可用于在CDATA部分中导航XML?

时间:2010-11-15 13:35:02

标签: java xml xpath

我正在试图弄清楚如何使用XPath从以下XML文档中的XML片段中获取exceptionID和instrumentID值(是的,在CDATA中使用XML有点奇怪,但这就是我从第三方服务)

<?xml version="1.0"?>
  <exception>
    <info>
      <![CDATA[
        <info>
          <exceptionID>1</exceptionID>
          <instrumentID>1</instrumentID>
        </info>
      ]]>
    </info>
</exception>

是否可以在一个XPath语句中获取值?

我在Java中使用javax.xml.xpath.XPath(JDK 1.5 with Xalan 2.7.1和Xerces 2.9.1),例如

XPath xpath = XPathFactory.newInstance().newXPath();

Long exceptionId  = new Long(((Double)xpath.evaluate(this.exceptionIdXPath, 
                               document, XPathConstants.NUMBER)).longValue());

这是this.exceptionIdXPath变量,我不知道如何设置,我知道例如:

/exception/info/text()/info/exceptionID将不起作用(text()返回CDATA内的数据,但没有“知道”它是XML)

2 个答案:

答案 0 :(得分:5)

是的,你可以做到。但是CDATA部分内的任何内容都是字符串,不会成为DOM的一部分。因此,您必须使用XPath的字符串操作函数。

在XPath中,您可以使用substring-before和substring-after。这样的事情可能有用:

substring-before(substring-after(/exception/info,"<exceptionID>"), "</exceptionID>")

答案 1 :(得分:2)

这将非常特定于您正在使用的工具(了解您正在使用的平台和库会很好),但通常您无法一步完成。 CDATA的重点在于它是原始字符数据,不一定是XML。

您可以做的是捕获exception / info中的text()(基本上是CDATA块的内容)并从中创建一个新的XML文档(在内存中),然后在该文档上使用XPath。

详细步骤与平台有关。