使用xpath从xml元素中选择许多属性之一

时间:2013-07-28 10:54:17

标签: xml xpath mule

我需要使用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"/>

顺便说一下,这些只是日志语句,我需要提取值并将其设置为另一个变量。

3 个答案:

答案 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存在一些问题。

  1. 与元素类型“env:Envelope”关联的属性“bme:version”的前缀“bme”未绑定。
  2. 元素类型<smrst:abc>不以结束标记终止。
  3. 首先纠正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"/>

就个人而言,我建议正确地声明和使用名称空间前缀,正如其他人所建议的那样。