如何从Mule foreach中的xml列表中提取值

时间:2014-12-31 19:03:16

标签: xpath mule mule-studio

我有以下SOAP响应: -

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <retrieveAllDataResponse xmlns="http://services.test.com/schema/MainData/V1">
         <retrieveAllData>
            <Response>The Data retrieved from the Database</Response>
            <Id>1231</Id>
            <Name>test1</Name>
            <Age>560</Age>
            <Designation>Software Engineer</Designation>
         </retrieveAllData>
         <retrieveAllData>
            <Response>The Data retrieved from the Database</Response>
            <Id>165</Id>
            <Name>test2</Name>
            <Age>561</Age>
            <Designation>Senior Software Engineer</Designation>
         </retrieveAllData>
         <retrieveAllData>
            <Response>The Data retrieved from the Database</Response>
            <Id>134</Id>
            <Name>test3</Name>
            <Age>562</Age>
            <Designation>HR</Designation>
         </retrieveAllData>
</retrieveAllDataResponse>
   </soap:Body>
</soap:Envelope>

现在我想从列表<retrieveAllData>中提取值并将其放入 foreach 下的流变量中: -

<foreach collection="#[xpath('//xmlns:retrieveDataResponse/xmlns:retrieveAllData')]" doc:name="For Each">
<set-variable doc:name="Variable" value="#[xpath('//xmlns:Id/text()').text]" variableName="id"/>
<logger level="INFO" message="#[flowVars['id']]" doc:name="Logger"/>
<set-variable doc:name="Variable" value="#[xpath('//xmlns:Name/text()').text]" variableName="name"/>
<logger level="INFO" message="#[flowVars['name']]" doc:name="Logger"/>
<set-variable doc:name="Variable" value="#[xpath('//xmlns:Age/text()').text]" variableName="age"/>
<logger level="INFO" message="#[flowVars['age']]" doc:name="Logger"/>
<set-variable doc:name="Variable" value="#[xpath('//xmlns:Designation/text()').text]" variableName="designation"/>

    

但我没有将值纳入变量中..我得到以下内容: -

 Splitter returned no results. If this is not expected, please check your split expression

请注意,我已经为命名空间设置了 XML命名空间管理器

请告诉我有没有更好的方法从列表中获取所有值并将其设置为流量变量?

3 个答案:

答案 0 :(得分:2)

         

<flow name="xmlsplitter" doc:name="xmlsplitter">
    <file:inbound-endpoint path="C:/var/lib/data" doc:name="File"/>
    <file:file-to-string-transformer doc:name="File to String"/>    
    <logger level="INFO" message="#[payload:]" doc:name="Logger" /> 
    <foreach collection="#[xpath('//out:retrieveAllData')]" doc:name="For Each">

        <set-variable doc:name="Variable" value="#[xpath('out:Designation/text()').wholeText]" variableName="id"/>
        <logger level="INFO" message="#[flowVars['id']]" doc:name="Logger"/>

    </foreach>      
</flow>

答案 1 :(得分:0)

我相信你的命名空间有问题,xmlns用于表示元素及其子元素的根命名空间,但是你使用xpath作为前缀,即://xmlns:retrieveDataResponse/xmlns:retrieveAllData'这是错的。尝试将名称空间myNameSpace定义为URI http://services.test.com/schema/MainData/V1,然后在xpath功能中使用它://myNameSpace:retrieveDataResponse/myNameSpace:retrieveAllData'

此外,如果您使用名称空间,您可能会遇到MULE-6508的xpath函数问题,请尝试禁用mule名称空间包含的单词。

最后,如果这是针对正在进行的开发,请尝试即将发布的Mule 3.6,其中包括根据wiki和{{3}对XML进行大幅改进的支持}。

答案 2 :(得分:0)

所以最终的工作解决方案是使用以下XPATH并且正在为我工​​作: - #[xpath('out:Designation/text()').wholeText]