Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有一个XPath表达式可用于在CDATA区域中导航XML?_Java_Xml_Xpath - Fatal编程技术网

Java 是否有一个XPath表达式可用于在CDATA区域中导航XML?

Java 是否有一个XPath表达式可用于在CDATA区域中导航XML?,java,xml,xpath,Java,Xml,Xpath,我试图弄清楚如何使用XPath从以下XML文档中的XML片段中获取exceptionID和instrumentID值(是的,在CDATA中包含XML有点奇怪,但这是我从第三方服务中获得的) 我不确定如何设置this.exceptionIdXPath变量,例如,我知道: /exception/info/text()。CDATA的要点在于它是原始字符数据,而不一定是XML 您可以做的是捕获exception/info(基本上是CDATA块的内容)中的text(),并从中创建一个新的XML文档(在内存

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

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


/exception/info/text()。CDATA的要点在于它是原始字符数据,而不一定是XML

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


具体步骤取决于平台。

这将非常特定于您使用的工具(最好知道您使用的是什么平台和库),但一般来说,您不能一步到位。CDATA的要点在于它是原始字符数据,而不一定是XML

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


具体步骤取决于平台。

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

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

substring-before(substring-after(/exception/info,"<exceptionID>"), "</exceptionID>")
前子字符串(后子字符串(/exception/info,“”“”)

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

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

substring-before(substring-after(/exception/info,"<exceptionID>"), "</exceptionID>")
前子字符串(后子字符串(/exception/info,“”“”)


您使用的是什么XPath/XSLT引擎?我在Java内部使用javax.xml.XPath.XPath(Xalan 2.7.1和Xerces 2.9.1的JDK 1.5)XPath 3.0可以通过一个表达式
解析xml(/exception/info)/info/exceptionID
使用解析xml,Saxon 9.3是用Java实现的,在其商业版本中支持XPath 3.0。@Martin Honnen-谢谢,我试过了,它成功了,但在我们的解决方案中引入了一个额外的库来解决一个问题(相比之下,这个问题相当小)。我在代码和我的问题跟踪程序中留下了一条注释,以便在我们转向XPath及其实现时重新讨论libs@karianna:不要将未解析的数据用作可解析的数据。错误的设计选择。您使用的是什么XPath/XSLT引擎?我在Java内部使用javax.xml.XPath.XPath(Xalan 2.7.1和Xerces 2.9.1的JDK 1.5)XPath 3.0可以通过一个表达式
解析xml(/exception/info)/info/exceptionID
使用解析xml,Saxon 9.3是用Java实现的,在其商业版本中支持XPath 3.0。@Martin Honnen-谢谢,我试过了,它成功了,但在我们的解决方案中引入了一个额外的库来解决一个问题(相比之下,这个问题相当小)。我在代码和我的问题跟踪程序中留下了一条注释,以便在我们转向XPath及其实现时重新讨论libs@karianna:不要将未解析的数据用作可解析的数据。糟糕的设计选择。我选择了这个有效的解决方案,多亏了子字符串示例,我已经开始尝试,但您的版本肯定比我的更紧凑:-)没有“特定解决方案”指示,也没有解析建议,这与“使用RegExp解析XML”属于同一类型的答案。@Alejandro是的,但这确实意味着,一旦第三方修复了它们的XML,我将来所要做的就是替换掉依赖注入的XPath语句。所以对我来说,这是一种务实的态度solution@Alejandro:绝对不是!因为CDATA的内容不是XML。CDATA声明它不是XML。它可能看起来像XML,但CDATA部分可能是作为一个粗糙的快捷方式添加的,因为有时内容不是有效的XML。归根结底是@GaryF在他的评论中说的:第三方误用或误解了它。我使用了这个解决方案,这很有效,感谢子字符串示例,我已经开始尝试,但您的版本肯定比我的版本更紧凑:-)没有“特定解决方案”指示,也没有解析建议,这与“使用RegExp解析XML”属于同一类答案。@Alejandro是的,但这确实意味着我将来要做的就是在第三方修复XML后交换掉依赖注入的XPath语句。所以对我来说,这是一种务实的态度solution@Alejandro:绝对不是!因为CDATA的内容不是XML。CDATA声明它不是XML。它可能看起来像XML,但CDATA部分可能是作为一个粗糙的快捷方式添加的,因为有时内容不是有效的XML。归根结底是@GaryF在评论中说的:第三方滥用或误解了它。老实说,最好的解决方案是与第三方谈谈他们在非结构化元素中滥用/误解结构化数据的问题。我猜这是不可能的。老实说,最好的解决方案是向第三方说明他们在非结构化元素中滥用/误解结构化数据的情况。我猜这是不可能的。
substring-before(substring-after(/exception/info,"<exceptionID>"), "</exceptionID>")