2017-08-01 55 views
1

我试图从通过的XPath下面的请求得到了价值的applicationID得到值: -XPath表达式从CDATA

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

+0

你有一个错误: POST – Borna

回答

2

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

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

使用contains()功能来限制元素具有在text()

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

JSON属性如果你想获得的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;,') 
+0

嗨。我按照你的建议实现了contains函数,但是我仍然得到以下输出结果:{“applicationId”:“12345678”,“status”:“ACTIVATED”} –

+0

是的,选择了Data元素中的文本。如果你只想要applicationId的数值,你需要解析它。你使用的是什么版本的XPath? –

0

如果您不能注册一个命名空间,你可以用这个去:

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

嗨。我能够添加一个名称空间,但我无法获得applicationId的值 –