在MULE中从soap消息中提取节点名

时间:2014-06-02 10:18:28

标签: web-services soap xpath mule-studio

我有一个接收SOAP消息的MULE流程。我试图在此肥皂消息中提取节点的名称。

我的肥皂信息如下:

<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:ns="http://abc/dto/2013/08" 
    xmlns:ns1="http://abc/message/dto/2013/08"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Header/>
   <soapenv:Body>
      <ns:RetrieveOrgNumber>
         <ns:request>
            <ns1:sessionId>SessionId</ns1:sessionId>
            <ns1:timeStamp>2001-12-31T12:00:00</ns1:timeStamp>
            <ns1:userIdentifier>UserIdentifier</ns1:userIdentifier>
            <ns1:language>EN</ns1:language>
            <ns1:source>SoapUI</ns1:source>
            <!-- 1 or more repetitions: -->
           <ns:orgNumber>AE7WJ046</ns:orgNumber>
         </ns:request>
      </ns:RetrieveOrgNumber>
   </soapenv:Body>
</soapenv:Envelope>

我希望能够在操作中检索节点RetrieveOrgNumber的名称。我想将其设置为变量。

我尝试了#[xpath(fn:local-name('soapenv:Envelope/soapenv:Body/*[1]'))]但是我收到了这个错误:

  

执行表达式xpath(fn:local-name('soapenv:Envelope / soapenv:Body / * [1]'))失败。 (org.mule.api.expression.ExpressionRuntimeException)。消息有效内容的类型为:String

我忘了添加我在消息流xml中添加名称空间:

<mulexml:namespace-manager>
    <mulexml:namespace prefix="soapenv" uri="http://schemas.xmlsoap.org/soap/envelope/" />
    <mulexml:namespace prefix="ns" uri="http://sanlam.co.za/group/party/service/clientmanagement/dto/2013/08" />
    <mulexml:namespace prefix="ns1" uri="http://sanlam.co.za/group/common/message/dto/2013/08" />
    <mulexml:namespace prefix="xsi" uri="http://www.w3.org/2001/XMLSchema-instance" />
    </mulexml:namespace-manager>

感谢你回复Mark。

我尝试过编辑,但它无效。我不能在这里发布我的流程图的图片。我需要至少10的声誉。

但是考虑到你的建议我尝试了Object to XML(StringTobyteArray不起作用)现在我的xpath表达式有:

#[xpath(local-name('soapenv:Envelope/soapenv:Body/*[1]'))]

我得到的错误是:

Caused by: [Error: unresolvable property or identifier: local]
[Near : {... xpath(local-name('soapenv:Envelope/s ....}]
                   ^
[Line: 1, Column: 7]
    at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getBeanProperty(ReflectiveAccessorOptimizer.java:687)
    at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getBeanPropertyAO(ReflectiveAccessorOptimizer.java:472)
    at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:374)

当我尝试fn:local-name时,fn发生了名称空间错误。

1 个答案:

答案 0 :(得分:0)

您有2个选项,或者您需要在Mule中声明命名空间,以便在XPath查询中使用这些命名空间。见http://www.mulesoft.org/documentation/display/current/XML+Namespaces

#[xpath(/soapenv:Envelope/soapenv:Body/*[1]/local-name())]

另一种选择是你尝试使用local-name(),而不是匹配本地名称而不是名称空间前缀:

#[xpath(/*[local-name()='Envelope']/*[local-name()='Body']/*[1]/local-name())]

修改

错误文件中的错误消息Message payload is of type: String也会跟随Byte[] expected之类的文字。所以你应该在XPath表达式前面添加一个变换器。例如:http://www.mulesoft.org/documentation/display/current/Using+Transformers

也许以下其中一项可以提供帮助:

  1. StringToObject
  2. StringToObjectArray