在Mule ESB的集成开发场景中,XML作为传统且通用的数据交换格式,广泛存在于各类系统对接的报文传递中。当需要对XML数据进行格式转换、内容提取、结构重组等操作时,DataWeave作为Mule ESB内置的原生数据转换引擎,提供了简洁高效的实现方式,无需依赖第三方组件即可完成复杂的XML转换需求。

DataWeave转换XML的基础准备
在使用DataWeave处理XML转换前,需要确保Mule项目的基础配置正确。首先需要在Mule项目的依赖中添加DataWeave相关模块,通常Anypoint Studio创建Mule项目时会默认包含该依赖。其次要明确输入的XML结构,以及期望输出的目标结构,这是编写转换脚本的基础。
假设我们有一个输入XML,内容如下:
<user>
<id>1001</id>
<name>张三</name>
<age>25</age>
<email>zhangsan@ipipp.com</email>
</user>
常用XML转换场景示例
场景一:XML转JSON
将XML转换为JSON是集成开发中最常见的需求之一,DataWeave可以通过简单的脚本实现该转换。在Mule流程的Transform Message组件中编写如下DataWeave脚本:
%dw 2.0
output application/json
---
{
userId: payload.user.id,
userName: payload.user.name,
userAge: payload.user.age,
userEmail: payload.user.email
}
上述脚本中,payload表示当前消息的输入负载,即输入的XML内容。执行转换后输出的JSON结果如下:
{
"userId": "1001",
"userName": "张三",
"userAge": "25",
"userEmail": "zhangsan@ipipp.com"
}
场景二:XML结构重组
如果需要对XML的结构进行调整,比如添加新节点、过滤原有节点、修改节点名称,也可以通过DataWeave实现。例如我们需要将原有XML的user节点重命名为member,同时过滤掉age节点,脚本如下:
%dw 2.0
output application/xml
---
{
member: {
id: payload.user.id,
name: payload.user.name,
email: payload.user.email,
registerTime: now() as String {format: "yyyy-MM-dd HH:mm:ss"}
}
}
转换后的XML输出结果如下:
<member>
<id>1001</id>
<name>张三</name>
<email>zhangsan@ipipp.com</email>
<registerTime>2024-05-20 14:30:00</registerTime>
</member>
场景三:XML内容过滤与条件处理
当XML中包含多个重复节点,需要按照条件过滤部分节点时,可以使用DataWeave的过滤函数。例如输入XML包含多个user节点,需要筛选出年龄大于20的用户:
<users>
<user>
<id>1001</id>
<name>张三</name>
<age>25</age>
</user>
<user>
<id>1002</id>
<name>李四</name>
<age>18</age>
</user>
<user>
<id>1003</id>
<name>王五</name>
<age>30</age>
</user>
</users>
对应的DataWeave脚本如下:
%dw 2.0
output application/xml
---
{
adultUsers: {
user: payload.users.user filter ($.age as Number > 20)
}
}
转换后的输出XML只会保留年龄大于20的用户节点:
<adultUsers>
<user>
<id>1001</id>
<name>张三</name>
<age>25</age>
</user>
<user>
<id>1003</id>
<name>王五</name>
<age>30</age>
</user>
</adultUsers>
DataWeave处理XML的核心语法说明
- 命名空间处理:如果输入XML包含命名空间,需要在DataWeave脚本中声明命名空间,例如
ns ns1 http://www.ipipp.com/schema,之后通过ns1#节点名的方式访问对应节点。 - 类型转换:XML中的节点内容默认是字符串类型,如果需要做数值比较、日期处理等操作,需要通过
as Number、as Date等方式进行类型转换。 - 空值处理:可以使用
default关键字为可能不存在的XML节点设置默认值,例如payload.user.nickname default "未知",避免转换时出现空指针错误。
注意事项
在编写DataWeave转换XML的脚本时,需要注意XML的节点层级关系,避免访问不存在的节点导致脚本报错。如果XML结构比较复杂,可以先使用Transform Message组件的自动映射功能生成基础脚本,再根据需要调整优化。另外,DataWeave 2.0相比1.0在语法和性能上都有提升,建议优先使用2.0版本编写转换脚本。