0

我需要使用 xPATH 提取 xml 标记之一包含的众多属性之一。我得到了一个 xml 有效负载,我正在运行的是一个骡子应用程序。这是我拥有的示例 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。

这就是我尝试过的并获得空值。请指导我。

<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"/>

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

4

3 回答 3

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]

希望这可以帮助。

于 2013-07-28T11:36:06.960 回答
1

您的样品有几个问题XML

  1. 与元素类型“env:Envelope”关联的属性“bme:version”的前缀“bme”未绑定。
  2. 元素类型<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" />

于 2013-07-29T01:10:38.730 回答
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"/>

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

于 2013-07-29T01:37:56.467 回答