You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Groovy将XML嵌套结构转CSV?现有代码未达预期

SAP网关Groovy脚本:XML转指定格式CSV修复方案

问题说明

给定如下XML输入:

<Root>
<Header>
  <Name>Abc</Name>
  <HDR>2345</HDR>
</Header>
<Detail>
  <Count>2</count>
  <LSR>25</LSR>
</Detail>
<Trailer>
  <Date>222</Date>
  <year>2012</year>
</Trailer>
</Root>

需要生成以分号为分隔符的CSV输出:

Abc;2345
2;25
222;2012

原脚本存在解析冗余、节点路径错误、分隔符不匹配等问题,无法得到预期结果,以下是修复后的方案。

修改后的Groovy脚本

import com.sap.gateway.ip.core.customdev.util.Message;
import groovy.xml.XmlSlurper;

def Message processData(Message message) {
    def body = message.getBody(java.lang.String) as String;
    def xml2CsvConverter = new Xml2CsvConverter()
    message.setBody(xml2CsvConverter.convert(body))
    return message
}

class Xml2CsvConverter {
    def convert(xmlInput) {
        // 单次解析XML
        def content = new XmlSlurper().parseText(xmlInput)
        
        // 分别提取各节点子元素文本,用分号拼接成每行
        def headerLine = content.Header.children().collect { it.text() }.join(';')
        def detailLine = content.Detail.children().collect { it.text() }.join(';')
        def trailerLine = content.Trailer.children().collect { it.text() }.join(';')
        
        // 拼接所有行,换行分隔
        def csvContent = [headerLine, detailLine, trailerLine].join('\n')
        
        return csvContent
    }
}

关键修复点

  • 移除冗余的XmlParser解析,仅用XmlSlurper处理XML,提升效率
  • 单独提取Header、Detail、Trailer三个节点的子元素文本,确保每个节点对应一行
  • 将分隔符从逗号改为分号,匹配期望输出格式
  • 用列表直接拼接各行内容,逻辑更清晰,避免原脚本中inject方法的错误使用
  • 注:原XML中<Count>2</count>标签大小写不匹配,XmlSlurper会忽略该差异不影响取值,但建议后续保证XML标签大小写一致

内容的提问来源于stack exchange,提问作者Abbas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:42:34