基于SAP CPI的Groovy脚本:按日期移除同级旧Letter节点
SAP CPI:用Groovy脚本移除同层级下创建日期更早的Letter节点
需求说明
针对每个<JobApplication>节点下的<OfferLetter>容器,仅保留其中<Letter>节点里创建日期最新的条目,移除其余更早的节点。
输入XML
<root> <JobApplication> <OfferLetter> <Letter> <offerLetterId>699</offerLetterId> <createdBy>00004221</createdBy> <createDate>2022-09-15T13:20:17.000</createDate> </Letter> <Letter> <offerLetterId>724</offerLetterId> <createdBy>00001472</createdBy> <createDate>2022-09-26T13:27:39.000</createDate> </Letter> </OfferLetter> </JobApplication> <JobApplication> <OfferLetter> <Letter> <offerLetterId>723</offerLetterId> <createdBy>00001472</createdBy> <createDate>2022-09-26T13:27:04.000</createDate> </Letter> </OfferLetter> </JobApplication> <JobApplication> <OfferLetter> <Letter> <offerLetterId>695</offerLetterId> <createdBy>00001472</createdBy> <createDate>2022-09-03T14:02:37.000</createDate> </Letter> </OfferLetter> </JobApplication> </root>
期望输出XML
<root> <JobApplication> <OfferLetter> <Letter> <offerLetterId>724</offerLetterId> <createdBy>00001472</createdBy> <createDate>2022-09-26T13:27:39.000</createDate> </Letter> </OfferLetter> </JobApplication> <JobApplication> <OfferLetter> <Letter> <offerLetterId>723</offerLetterId> <createdBy>00001472</createdBy> <createDate>2022-09-26T13:27:04.000</createDate> </Letter> </OfferLetter> </JobApplication> <JobApplication> <OfferLetter> <Letter> <offerLetterId>695</offerLetterId> <createdBy>00001472</createdBy> <createDate>2022-09-03T14:02:37.000</createDate> </Letter> </OfferLetter> </JobApplication> </root>
Groovy脚本实现
在SAP CPI的Groovy脚本步骤中使用以下代码:
import groovy.xml.XmlParser import groovy.xml.XmlNodePrinter // 读取输入XML def inputXml = message.getBody(String.class) def parser = new XmlParser() def rootNode = parser.parseText(inputXml) // 遍历每个JobApplication节点 rootNode.JobApplication.each { jobApp -> def offerLetter = jobApp.OfferLetter[0] def letters = offerLetter.Letter if (letters.size() > 1) { // 将Letter节点按createDate降序排序,取第一个为最新节点 def sortedLetters = letters.sort { a, b -> Date.parse("yyyy-MM-dd'T'HH:mm:ss.SSS", b.createDate.text()) <=> Date.parse("yyyy-MM-dd'T'HH:mm:ss.SSS", a.createDate.text()) } // 移除除最新节点外的所有Letter节点 sortedLetters.drop(1).each { it.parent().remove(it) } } } // 格式化输出XML def writer = new StringWriter() def printer = new XmlNodePrinter(new PrintWriter(writer)) printer.preserveWhitespace = true printer.print(rootNode) // 设置输出消息 message.setBody(writer.toString())
脚本说明
- 解析输入XML并获取根节点;
- 遍历每个
<JobApplication>,定位其下的<OfferLetter>容器; - 当容器内存在多个
<Letter>时,按createDate降序排序,仅保留最新的节点,移除其余节点; - 格式化XML输出,确保格式与输入一致。
内容的提问来源于stack exchange,提问作者Jorge Ramón
相关产品推荐
相关产品推荐

