我需要使用xPATH提取其中一个xml标记包含的众多属性之一。 我得到一个xml有效负载,我正在运行的是一个mule应用程序。 这是我的样本xml。
<?xml version="1.0" encoding="UTF-8" ?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" bme:version="1-0" xsi:schemaLocation="">
<env:Header>
</env:Header>
<env:Body>
<smrst:abc xmlns:smrst="http://abc.xyz.com/2013/123-model-result" xmlns:smc="http://abc.xyz.com/2013/123-model-core" smc:applcode="123" smc:appInter="abc" smc:applicationId="123456ACV 20121203000000001239" smc:bC="111" smc:bT="GHJ" smc:ent="GHJ123" smc:mT="ASDFGH" smc:NH="33" smc:BH="0">
</env:Body>
</env:Envelope>
以上示例xml我想提取smc:NH值和smc:BH值uisng xpath。
这是我尝试过并获得null。请指导我。
<logger message="value for hit 1'st #[xpath:Envelope/Body/abc/@smc:NH]" level="INFO" doc:name="Logger"/>
当我尝试跟随时,我得到一个错误,不知道我错过了什么。
<logger message="value for hit #[xpath:/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='abc']/@applcode]" level="INFO" doc:name="Logger"/>
顺便说一下,这些只是日志语句,我需要提取值并将其设置为另一个变量。
答案 0 :(得分:1)
为xpath寻找的命名空间添加mule xml命名空间管理器,如下所示。
<xm:namespace prefix="env" uri="http://www.w3.org/2003/05/soap-envelope" />
<xm:namespace prefix="smrst" uri="http://abc.xyz.com/2013/123-model-result" />
<xm:namespace prefix="smc" uri="http://abc.xyz.com/2013/123-model-core" />
然后按如下所示更改xpath。
#[xpath://env:Envelope/env:Body/smrst:abc/@smc:NH]
希望这有帮助。
答案 1 :(得分:1)
您的样本XML
存在一些问题。
<smrst:abc>
不以结束标记终止。首先纠正XML
,然后将命名空间管理器添加到您的mule配置
<xm:namespace-manager>
<xm:namespace prefix="env" uri="http://www.w3.org/2003/05/soap-envelope" />
<xm:namespace prefix="smrst" uri="http://abc.xyz.com/2013/123-model-result" />
<xm:namespace prefix="smc" uri="http://abc.xyz.com/2013/123-model-core" />
</xm:namespace-manager>
然后执行此操作XPath
:
<logger message="Value of NH is: #[xpath('//env:Envelope/env:Body/smrst:abc/@smc:NH').value]" level="INFO" />
答案 2 :(得分:1)
正如其他人所指出的那样,您需要声明您的名称空间并正确使用名称空间前缀,或者使用local-name()
作为所有内容,正如您已经为元素所做的那样:
<logger message="value for hit #[xpath:/*[local-name()='Envelope']
/*[local-name()='Body']
/*[local-name()='abc']
/@*[local-name() = 'applcode']"
level="INFO" doc:name="Logger"/>
就个人而言,我建议正确地声明和使用名称空间前缀,正如其他人所建议的那样。