Mule 4中如何将提取的XML文件转换为可操作的JSON格式
Mule 4.4 EE 环境下Excel工作表XML转JSON实现方案
首先纠正一个识别错误:你标注的application/java媒体类型是错的,当前提取到的内容是OOXML标准Excel文件解压后生成的单工作表XML片段,另外你贴出的样本存在多处标签截断(K1、J2单元格标签未闭合,行节点、根节点也未闭合),正式处理前必须确保从zip包中提取到完整、语法合法的XML文件,否则解析会直接失败。
处理步骤
1. 修正输入MIME类型
首先手动将payload的MIME类型设置为XML,否则Mule内置的XML解析器无法正常识别内容:
<set-payload value="#[payload]" mimeType="application/xml" encoding="UTF-8" doc:name="修正MIME类型为XML"/>
2. 通过DataWeave脚本直接映射为JSON结构
这个XML带默认命名空间,脚本里需要先声明命名空间,逻辑是先读取第一行内容作为表头映射,再逐行读取数据,按单元格的位置标识匹配对应字段,自动跳过空单元格、兼容行内单元格位置错乱的情况。
直接在Transform Message组件里用下面的脚本即可:
%dw 2.0 ns ss http://schemas.openxmlformats.org/spreadsheetml/2006/main output application/json --- do { // 提取第一行作为列名映射 var headerMapping = payload.ss#worksheet.ss#sheetData.ss#row[0].ss#c map { colCode: $.@r replace /\d+/ with "", // 从单元格引用(如A1)提取列标识A colName: $.ss#is.ss#t } // 从第二行开始遍历数据行 var tableData = payload.ss#worksheet.ss#sheetData.ss#row[1 to -1] map (currentRow) -> { (currentRow.ss#c map (currentCell) -> { var cellCol = currentCell.@r replace /\d+/ with "" var matchField = headerMapping filter ($.colCode == cellCol) map $.colName joinBy "" (matchField): if (currentCell.ss#is.ss#t != "") currentCell.ss#is.ss#t else null }) } --- tableData }
注意事项
- 你提供的样本第二行存在位置错乱的单元格(
r="A5"的单元格出现在r="2"的行节点下),上述脚本是按单元格自带的位置属性匹配列,不是按标签出现顺序映射,不会因为这种错位导致字段匹配错误。 - 样本里的出生日期值
1992-13-11T04:00:00是非法日期值(不存在13月),如果后续要做日期类型转换,必须先加合法性校验,否则会抛类型转换错误。 - 如果后续需要处理完整xlsx文件,不需要手动解压解析XML,直接使用Mule官方Excel连接器读取文件即可,组件会自动处理所有格式兼容问题,容错率远高于手动解析XML。
内容的提问来源于stack exchange,提问作者Willy Kelly
相关产品推荐
相关产品推荐

