SAP CPI中基于孙节点过滤父节点的Groovy实现方法
SAP CPI基于孙节点过滤移除父节点的Groovy实现
需求说明
移除所有不包含localeID="es"且translation="Type 1"的localizedTitle子节点的payload节点,仅保留符合条件的payload(对应示例中的Doc1和Doc4)。
输入XML
<?xml version="1.0" encoding="UTF-8"?> <root> <payload> <title>Doc1</title> <localizedTitle> <localeID>es</localeID> <translation>Type 1</translation> </localizedTitle> <localizedTitle> <localeID>en</localeID> <translation>Type 1</translation> </localizedTitle> </payload> <payload> <title>Doc3</title> <localizedTitle> <localeID>es</localeID> <translation>Type 3</translation> </localizedTitle> <localizedTitle> <localeID>en</localeID> <translation>Type 3</translation> </localizedTitle> </payload> <payload> <title>Doc4</title> <localizedTitle> <localeID>es</localeID> <translation>Type 1</translation> </localizedTitle> <localizedTitle> <localeID>en</localeID> <translation>Type 1</translation> </localizedTitle> </payload> </root>
预期输出XML
<?xml version="1.0" encoding="UTF-8"?> <root> <payload> <title>Doc1</title> <localizedTitle> <localeID>es</localeID> <translation>Type 1</translation> </localizedTitle> <localizedTitle> <localeID>en</localeID> <translation>Type 1</translation> </localizedTitle> </payload> <payload> <title>Doc4</title> <localizedTitle> <localeID>es</localeID> <translation>Type 1</translation> </localizedTitle> <localizedTitle> <localeID>en</localeID> <translation>Type 1</translation> </localizedTitle> </payload> </root>
Groovy实现代码
import groovy.xml.XmlSlurper import groovy.xml.XmlUtil // 获取输入的XML内容 def inputXml = message.getBody(String) // 解析XML def rootNode = new XmlSlurper().parseText(inputXml) // 过滤并移除不符合条件的payload节点 rootNode.payload.findAll { payload -> // 检查当前payload下是否存在满足条件的localizedTitle !payload.localizedTitle.any { lt -> lt.localeID == 'es' && lt.translation == 'Type 1' } }.each { it.replaceNode {} } // 将处理后的XML转换为字符串并设置回消息体 def outputXml = XmlUtil.serialize(rootNode) message.setBody(outputXml)
代码说明
- 使用
XmlSlurper解析XML,适配SAP CPI的轻量XML处理场景 - 通过
findAll筛选出不满足条件的payload节点,用replaceNode {}直接移除 - 核心逻辑:判断
payload下是否存在符合localeID="es"且translation="Type 1"的localizedTitle子节点,不存在则剔除该payload - 最后用
XmlUtil.serialize生成标准XML格式,替换原消息体完成处理
内容的提问来源于stack exchange,提问作者Jorge Ramírez
相关产品推荐
相关产品推荐

