我正在尝试解析输入 XML 有效负载并转换并生成响应 XML。 这是我的输入 XML
<?xml version='1.0' encoding='UTF-8'?>
<EmployeesInfo>
<EmployeeDetails>
<Emp>a</Emp>
<Emp>b</Emp>
<Emp>c</Emp>
<Emp>d</Emp>
</EmployeeDetails>
<AddressDetails>
<city>Munich</city>
</AddressDetails>
</EmployeesInfo>
EmployeeDetails
元素是可选的,可能存在于传入的有效负载中,也可能不存在。它可能包含 Emp
子元素,也可能不包含 Emp
子元素
我想要的输出 XML 是:
<?xml version='1.0' encoding='UTF-8'?>
<EmployeesInfo>
<EmployeeDetails>
<Emp>a</Emp>
<Emp>b</Emp>
<Emp>c</Emp>
<Emp>d</Emp>
</EmployeeDetails>
...
...
other XML elements
</EmployeesInfo>
尝试提取
EmployeeDetails
和 Emp
时遇到错误
这里有两个版本的代码,它们都可以在 Dataweave Playground 中运行,但在 Anypoint studio ( 7.16 ) Mule 运行时 4.6.1 EE 中运行时都失败
使用后代选择器的版本 1:
%dw 2.0
output application/xml skipNullOn = "everywhere", inlineCloseOn = ""
---
{
EmployeesInfo: {
(EmployeeDetails: {
((payload.EmployeesInfo.EmployeeDetails.. default []) map ((item) -> {
"Emp" : item
}))
}) if (payload.EmployeesInfo.EmployeeDetails?)
}
}
当存在
Emp
元素时,此方法工作正常,但当不存在 Emp
元素时,此方法会失败并出现错误:
You called the function 'Descendants Selector ..' with these arguments:
1: Null (null)
But it expects one of these combinations:
(Array)
(Object)
103| ((payload.EmployeesInfo.EmployeeDetails.. default []) map ((item, index) -> {
还尝试使用多值选择器:
%dw 2.0
output application/xml skipNullOn = "everywhere", inlineCloseOn = ""
---
{
EmployeesInfo: {
(EmployeeDetails: {
((payload.EmployeesInfo.EmployeeDetails.*Emp default []) map ((item) -> {
"Emp" : item
}))
}) if (payload.EmployeesInfo.EmployeeDetails?)
}
}
当
Emp
不存在并出现与上面类似的错误时,这也会失败..
注意: 这两个版本的代码在浏览器中的 Dataweave Playground 中都工作正常,但在 Anypoint Studio 的实际运行时,事情却失败了......
我该如何解决这个问题?
因此找到了一种方法来解决这个问题,方法是检查元素是否存在,然后再应用: 首先检查
EmployeeDetails
是否存在
在应用后代选择器之前进行第二次检查(这是必需的,否则如果没有子元素,后代选择器检查会抛出错误)
这会检查 EmployeeDetails
是否有任何子元素
{
(EmployeesInfo:{
(EmployeeDetails:(payload.EmployeesInfo.EmployeeDetails.. )) if (!isEmpty(payload.EmployeesInfo.EmployeeDetails) )
})if (payload.EmployeesInfo.EmployeeDetails?)
}