2013-07-28 44 views
0

我需要使用xPATH提取其中一个xml标签包含的许多属性之一。 我得到一个xml有效载荷,我运行的是一个mule应用程序。 这里是我有的示例xml。使用xpath从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 201212030000000" 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"/> 

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

+1

“我得到一个错误” - 什么错误? –

+0

从'/'@ applicationCode''中的属性名称中删除引号'''。 –

回答

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] 

希望这会有所帮助。

+0

我将命名空间添加到mule xml配置中。如下所示 – user2160677

+0

我将命名空间添加到mule配置中,并像上面提到的那样更改了xpath表达式。 但我现在得到以下错误。 无法解析名称空间前缀'env'(org.jaxen.UnresolvableException)。 这是如何在我的mule-xml配置中添加新的命名空间。 xmlns:env =“http://www.w3.org/2003/05/soap-envelope”xmlns:smrst =“http://abc.xyz。com/2013/abc-model-result“xmlns:smc =”http://abc.xyz.com/2013/abc-model-core“ 这就是xpath看起来像现在的样子。 #[xpath://env:Envelope/env:Body/smrst:SanctionsResult/@ smc:applicationCode] – user2160677

+0

我正在使用xPATH表达式来忽略名称空间值 但是这返回null。任何想法我错过了什么? – user2160677

1

您的样品XML有几个问题。

  1. 与元素类型“env:Envelope”关联的属性“bme:version”的前缀“bme”未绑定。
  2. 元素类型<smrst:abc>未终止于结束标记。

正确XML第一,然后添加命名空间管理你的骡子配置

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

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

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

相关问题