骡子 4 中的 xpath 3 到 XmlModule::xpath()

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

我正在尝试从 Mule 3 迁移到 Mule 4。

Mu​​le 4 不支持 XPATH3。

我在 Mule3 中有 xpath:

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

Mule 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

我正在使用 #[XmlModule::xpath()] 在 mule 4 中尝试 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,
{})]".

Mule 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() 的调用在第一个右括号后的第一个参数中缺少右引号。看起来它在表达式中已修复,但错误消息未更新。

无论如何,在那之后我遇到了一个错误,因为该函数需要一个二进制作为第二个参数。在我的测试中,xpath-extract 操作运行良好:

<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。