我正在试图弄清楚如何使用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)
答案 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。
详细步骤与平台有关。