我正在尝试通过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":"'),
'",')
关于xml - Xpath表达式从CDATA获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45439788/