xpath 3 to XmlModule::xpath() in mule 4



我正试图从Mule 3迁移到Mule 4。

Mule 4不支持XPATH3。

我在Mule3:中有xpath

xpath3('/DTOApplication/DTOLocation[@Status='Active']',flowVars.domPayload,'NODESET')

骡子3流量:

<flow name="xpath_transformFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="/stepnode" allowedMethods="POST" doc:name="HTTP"/>
<set-variable variableName="dtolocation" value="#[xpath3('/DTOApplication/DTOLocation[@Status='Active']',flowVars.domPayload,'NODESET')]" doc:name="set dtolocation"/>
<logger message="#[flowVars.dtolocation]" level="INFO" doc:name="Logger"/>
</flow>

xml负载:https://github.com/Manikandan99/rate-dtostep/blob/master/request.xml

我正在mule 4中使用#[XmlModule::xpath((]尝试xpath,但它显示错误。

错误消息:

Script 'XmlModule::xpath('/DTOApplication/DTOLocation[@Status='Active'],vars.domPayload,
{}) ' has errors:   Invalid input ''', expected ')' for the function
call. (line 1, column 18):  at 1 : 1" evaluating expression:
"#[XmlModule::xpath('/DTOApplication/DTOLocation[@Status='Active'],vars.domPayload,
{})]".

骡子4流量:

<flow name="var_xpath_testFlow" doc:id="406270fb-17e7-48e9-a33a-f7a0197f8e05" >
<http:listener doc:name="Listener" doc:id="662f2277-859f-4516-974b-de7cceeb5b40" config-ref="HTTP_Listener_config" path="/vartest"/>
<set-variable value="#[payload]" doc:name="Set domPayload" doc:id="2495ac98-b976-41e0-9dcf-398574e54ffa" variableName="domPayload"/>
<set-variable value="#[XmlModule::xpath('/DTOApplication/DTOLocation[@Status='Active'],vars.domPayload, {})]" doc:name="Set dtolocation_value" doc:id="3c751150-3606-4c40-9748-e658d9e6e59e" variableName="dtolocation_value"/>
<logger level="INFO" doc:name="Logger" doc:id="f495b0bf-f8cb-43be-b4d9-d069758e4028" message="#[vars.dtolocation_value]"/>
</flow>

如何在mule 4中使用它?

对xpath((的调用在第一个参数中第一个右括号后缺少一个右引号。它在表达式中看起来是固定的,但错误消息不会更新。

无论如何,在那之后我出现了一个错误,因为函数需要一个Binary作为第二个参数。在我的测试中,xpath提取操作运行良好:

<xml-module:xpath-extract xpath="/DTOApplication/DTOLocation[@Status='Active']" doc:name="Xpath extract"/>

作为替代方案,我更喜欢使用DataWeave:

%dw 2.0
output application/xml
---
payload.DTOApplication filterObject ($$ as String == "DTOLocation" and $$.@Status == "Active")

请注意,如果您正在使用输出执行进一步的处理,那么最好输出application/java。

最新更新