Mule 在dwl转换消息中使用xpath3

Mule 在dwl转换消息中使用xpath3,mule,dataweave,mule4,Mule,Dataweave,Mule4,我想检查XML负载中是否存在节点。为此,我想在mule4的转换消息中使用xpath3 输入: <XML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <ABC xsi:nil="true"/> <DEF/> </XML> 预期产量 json: 请帮我解决这个问题。为什么要使用xpath?使用以下dataweave表达式可以获得相

我想检查XML负载中是否存在节点。为此,我想在mule4的转换消息中使用xpath3

输入:

<XML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <ABC xsi:nil="true"/>
    <DEF/>
</XML>
预期产量 json:


请帮我解决这个问题。

为什么要使用xpath?使用以下dataweave表达式可以获得相同的结果:

检查元素是否存在,是否为零 检查元素是否存在且非nil nil必须设置为false或在ABC有值时移除: 使用以下表达式的输出示例:


为什么要使用xpath?使用以下dataweave表达式可以获得相同的结果:

检查元素是否存在,是否为零 检查元素是否存在且非nil nil必须设置为false或在ABC有值时移除: 使用以下表达式的输出示例:


Mule 4.x中的DataWeave 2.x没有xpath3函数。如果出于某种原因,您希望在DataWeave中使用XPATH,则必须自己开发该函数,尽管我建议不要这样做


推荐的方法是将其迁移到DataWeave表达式,如@olamiral solution。

Mule 4.x中的DataWeave 2.x没有xpath3函数。如果出于某种原因,您希望在DataWeave中使用XPATH,则必须自己开发该函数,尽管我建议不要这样做


推荐的方法是将其迁移到DataWeave表达式,如@olamiral solution。

感谢您对olamiral的响应,但您建议的逻辑是,在这两种情况下,输出都将是no。xsi:nil=true表示元素为null,我必须使用skipNullOn来消除其他null元素,我使用Xpath,这样即使xsi:nil=true,我也应该能够在负载中检测到它的存在。这很奇怪:我使用了您提供的负载,并运行了一些测试,在第一种情况下它返回了预期值,如果存在带xsi:nil true或false的ABC,则表达式将返回“yes”或“no”。在第二种情况下,当ABC不存在或其值为空或其值不为空但xsi:nil为真时,表达式返回“no”。否则,它将返回“yes”。您能否提供有关如何运行测试的其他信息?关于skipNullOn,它会影响输出,与作为输入提供的XML无关。此属性将从输出中删除所有具有空值的JSON属性。添加了一个屏幕截图以说明表达式行为。嘿,Olamiral,我现在有一个JSON{abc:}我想将其转换为xml。与这个过程相反,我该怎么做呢?谢谢你的回复olamiral,但是你所建议的逻辑,在这两种情况下,输出都是否定的。xsi:nil=true表示元素为null,我必须使用skipNullOn来消除其他null元素,我使用Xpath,这样即使xsi:nil=true,我也应该能够在负载中检测到它的存在。这很奇怪:我使用了您提供的负载,并运行了一些测试,在第一种情况下它返回了预期值,如果存在带xsi:nil true或false的ABC,则表达式将返回“yes”或“no”。在第二种情况下,当ABC不存在或其值为空或其值不为空但xsi:nil为真时,表达式返回“no”。否则,它将返回“yes”。您能否提供有关如何运行测试的其他信息?关于skipNullOn,它会影响输出,与作为输入提供的XML无关。此属性将从输出中删除所有具有空值的JSON属性。添加了一个屏幕截图以说明表达式行为。嘿,Olamiral,我现在有一个JSON{abc:}我想将其转换为xml。与此过程相反,我该如何做?
%dw2.0
output application/json skipNullOn="everywhere"
---
if(xpath3('//:ABC',payload.XML,'BOOLEAN')
 "abc": "yes
else
 "abc": "no" 
{
"abc": "yes"
}
%dw 2.0
output application/json skipNullOn="everywhere"
---
{
    "abc": if (payload.XML.ABC?) "yes" else "no"
}
%dw 2.0
output application/json skipNullOn="everywhere"
---
{
    "abc": if (!isEmpty(payload.XML.ABC)) "yes" else "no"
}