Xpath表达式从CDATA获取值

时间:2017-08-01 13:51:32

标签: 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没有返回任何值。

2 个答案:

答案 0 :(得分:2)

<d>元素中的JSON内容只是一个text()节点。 &#34; applicationId&#34;在您的JSON字符串中不会被评估为属性。使用CDATA这一事实无关紧要。

您的谓词正在尝试从text()的{​​{1}}元素中选择app:Data,但没有。{/ p>

使用contains()函数限制@applicationId

中具有该JSON属性的元素
text()

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

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

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

XPath 2.0 - 使用replace()

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

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

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

答案 1 :(得分:0)

如果您无法注册命名空间,可以使用:

"/*[name()='ApplicationStatusNotificationRequestMessage']/*[name()='Data']"