xml - Xpath表达式从CDATA获取值

标签 xml xpath apache-camel

我正在尝试通过xpath从以下请求中获取applicationId的值:

<ApplicationStatusNotificationRequestMessage xmlns="http://schemas.co.za/application">
    <b>http://localhost/test/sonoras</b>
    <c>POST</c>
    <Data><![CDATA[{"applicationId":"12345678","status":"ACTIVATED"}]]></Data>
</ApplicationStatusNotificationRequestMessage>


我正在使用的xpath表达式:

//app:ApplicationStatusNotificationRequestMessage/app:Data[@applicationId]/text()


不幸的是,XPath没有返回任何值。

最佳答案

<d>元素内的JSON内容只是一个text()节点。 JSON字符串中的“ applicationId”不会被视为属性。使用CDATA的事实是无关紧要的。

您的谓词试图从具有text()app:Data元素中选择@applicationId,并且没有。

使用contains()函数将元素限制为在text()中具有该JSON属性的元素

//app:ApplicationStatusNotificationRequestMessage/
  app:Data[contains(., 'applicationId')]/text()


如果要获取applicationId值,则需要解析JSON字符串。有很多方法可以做到这一点。根据您使用的XPath版本,您将有更多/更少的选择。有关如何获取值的一些示例:

XPath 3.0-使用json-to-xml()

json-to-xml(//app:ApplicationStatusNotificationRequestMessage/
        app:Data[contains(., 'applicationId')]/text())/*/*[@key='applicationId']/text()


XPath 2.0-使用replace()

replace(//app:ApplicationStatusNotificationRequestMessage/
        app:Data[contains(., 'applicationId')]/text(), '.*applicationId.*?:.(\d+).,.*', '$1')


XPath 1.0-使用substring-before()substring-after()

substring-before(
  substring-after(//app:ApplicationStatusNotificationRequestMessage/
                    app:Data[contains(., 'applicationId')]/text(), 
         'applicationId&quot;:&quot;'), 
  '&quot;,')

关于xml - Xpath表达式从CDATA获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45439788/

相关文章:

xml - 在 XPath 表示法中,表达式//*[self::SOME_LABEL] 与//SOME_LABEL 有何不同?

xpath - 在xpath中将字符串/字符连接n次

java - 如何从蓝图动态设置HTTP方法(Camel-http)

jms - 分布式事务 Java JMS

java-8 - 以下表达式应如何正确翻译为蓝图 "bean"属性表示法?

java - XSLT 从两个不同的源读取(XML 文件和 Excel 工作表)

sql-server - 查询多个 XML 值

java - 将字符串列表存储为人类可读的路径

java - 如何将java id转换为ASCII字符字符串中的数字形式?

java - 宽度和高度匹配问题