代码之家  ›  专栏  ›  技术社区  ›  Martijn Verburg

有没有一个XPath表达式可以用于在CDATA节中导航XML?

  •  1
  • Martijn Verburg  · 技术社区  · 15 年前

    我正试图找出如何使用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和Xalan 2.7.1以及xerces2.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 回复  |  直到 15 年前
        1
  •  5
  •   Mark Thomas    15 年前

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

    在XPath中,可以在前面使用子字符串,在后面使用子字符串。类似的事情可能会奏效:

    substring-before(substring-after(/exception/info,"<exceptionID>"), "</exceptionID>")
    
        2
  •  2
  •   GaryF    15 年前

    这将是非常具体的工具,你正在使用(这将是一个很好的知道什么平台和库你正在使用),但通常你不能做到这一步。CDATA的关键在于它是原始字符数据,而不一定是XML。

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

    具体步骤取决于平台。