尝试解析 XML 负载但出现错误:您使用以下参数调用了函数“后代选择器 ..”:1:String ("")

问题描述 投票:0回答:1

我正在尝试解析输入 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 的实际运行时,事情却失败了......

我该如何解决这个问题?

mule dataweave mule-studio mule4 anypoint-studio
1个回答
0
投票

因此找到了一种方法来解决这个问题,方法是检查元素是否存在,然后再应用: 首先检查

EmployeeDetails
是否存在 在应用后代选择器之前进行第二次检查(这是必需的,否则如果没有子元素,后代选择器检查会抛出错误) 这会检查
EmployeeDetails
是否有任何子元素

{
    (EmployeesInfo:{
        (EmployeeDetails:(payload.EmployeesInfo.EmployeeDetails.. )) if (!isEmpty(payload.EmployeesInfo.EmployeeDetails)  )
       
    })if (payload.EmployeesInfo.EmployeeDetails?)
}
© www.soinside.com 2019 - 2024. All rights reserved.