news 2026/9/16 14:49:16

SAP CPI 教程004 如何通过groovy修改XML节点属性值

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SAP CPI 教程004 如何通过groovy修改XML节点属性值

SAP SuccessFactors 的 API 会因版本和类型的不同,返回不同格式的数据。核心的 API 包括标准的OData API(主要返回 JSON 或 ATOM XML)以及传统的SFAPI SOAP API(基于 XML)。

一 SuccessFactors集成涉及的一些名词解释

  • 查询参数 ($select, $expand, $filter):支持标准的 OData 查询方法来过滤、筛选和展开关联数据,满足不同获取数据的场景。

  • SAML & OAuth:支持通过 SAML 断言获取 OAuth 访问令牌的模式,用于安全地进行 API 调用。

  • Picklist 值:查询时可以请求展开picklistLabels导航属性,在响应中直接获取标签文本而非 ID,减少额外查询。

  • 字段映射与布尔值:集成时注意数据类型映射,尤其在与其他系统对接场景中,SuccessFactors 的布尔值 (true/false) 可能会被转换为1/0

  • Integration Center 配置:可以在Integration Center通过界面化方式创建数据集成,并选择 XML 格式输出,降低配置难度。

  • Compound Employee API:一个 SOAP API,可用于通过单一请求检索一个或多个员工的完整或部分数据,通常通过 XPath 寻址来提取指定信息。

二 自定义CPI场景如何修改替换XML节点的值

2.1 方式一 xml.Content.toString().replace('Jane', '刘巍')

这里关键就是replace方法,可以替换节点或者节点属性值,例如下图中的context节点有个jane的关键子,我现在用刘巍替换jane。

import com.sap.it.script.v2.api.Message import groovy.xml.XmlSlurper import groovy.xml.StreamingMarkupBuilder def Message processData(Message message) { // 1. CPI 强制要求:流式读取消息体(无报错) def reader = message.getBody(java.io.Reader) // 2. 用 XmlSlurper 解析(CPI 唯一推荐) def xml = new XmlSlurper().parse(reader) xml.Content = xml.Content.toString().replace('Jane', '刘巍') // Serialize the modified XML def updatedXml = groovy.xml.XmlUtil.serialize(xml) message.setBody(updatedXml) // Set the modified XML as the message body return message }
import com.sap.gateway.ip.core.customdev.util.Message; def Message processData(Message message) { def body = message.getBody(java.lang.String) as String; def messageLog = messageLogFactory.getMessageLog(message); if(messageLog != null) { messageLog.setStringProperty("log2","formid") messageLog.addAttachmentAsString("log2",body,"text/plain"); } return message; }

2.2 方式二 循环节点修改

第二种方式是每个循环每个节点,例如下图中有两个order的父节点,每个order节点下面有两个子节点status,现在我只是想替换第一个status节点的值。

import com.sap.it.script.v2.api.Message import groovy.xml.XmlParser import groovy.xml.XmlNodePrinter import java.io.StringWriter def Message processData(Message message) { // 1. 解析 def reader = message.getBody(Reader) def root = new XmlParser().parse(reader) // 2. 循环修改 root.order.each { order -> // 找到 order 下的 status 节点 def statusNode = order.status[0] // status[0] 取第一个(因为可能多个同名) if (statusNode) { statusNode.value = 'completed' // 直接修改节点值 } } // 3. 将修改后的树写回 def writer = new StringWriter() new XmlNodePrinter(new PrintWriter(writer)).print(root) message.setBody(writer.toString()) return message }

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 14:48:40

IMA-ADPCM嵌入式语音编码实战:4-bit差分量化与裸机C实现

简介:本资源是一份面向通信工程、嵌入式音频开发及数字信号处理初学者的ADPCM语音压缩技术实践包,聚焦语音编码原理理解与标准算法实现。资源完整呈现G.721、G.723等主流ADPCM标准的核心逻辑,涵盖编码器(encode.c)、解…

作者头像 李华
网站建设 2026/9/16 14:47:30

微信iPad协议暴力接管私域,封号?不存在的

搞技术的老哥们,今天咱们聊点硬核的。最近后台一堆兄弟私信我,说被公司老板催着搞微信自动化,手动加好友加到腱鞘炎,群发消息发到手抽筋,朋友圈点赞像在刷单。更离谱的是,有人图省事上了些野路子框架&#…

作者头像 李华
网站建设 2026/9/16 14:46:58

40天进阶训练计划的设计与执行策略

1. 项目背景解析"ADVANCE Day40"这个项目名称看起来像是一个为期40天的进阶训练计划。从命名方式来看,它很可能属于自我提升、技能训练或专业能力培养类项目。这类项目通常具有明确的时间框架和阶段性目标,适合希望在特定领域获得系统性提升的…

作者头像 李华
网站建设 2026/9/16 14:46:54

PyTorch全连接神经网络实现温度回归预测实战

简介:面向PyTorch初学者和需要完成课程设计或期末作业的学生,这套基于全连接神经网络与Adam优化器的天气温度回归预测项目源码,以历史天气数据预测温度为具体任务,完整演示了从数据准备、网络搭建、模型训练到结果可视化的回归流程…

作者头像 李华
网站建设 2026/9/16 14:46:28

Unity编辑器触摸模拟器:用鼠标+Ctrl调试双指手势的完整方案

做手游的朋友应该都有过这种经历:功能在手机上跑得好好的,一回到编辑器就什么都测不了。尤其是我最近在做的这个项目,捏合缩放地图、双指旋转相机、滑动操作列表,这些交互全部写在了旧式Input系统的触摸接口上。代码里清一色的Inp…

作者头像 李华
网站建设 2026/9/16 14:46:01

STM32C542 PWM实战:频率精度、占空比平滑与引脚复用避坑指南

1. 项目概述:为什么STM32C542的PWM调试总让人卡在“调不动”这一步?你手头那块刚焊好的STM32C542开发板,LED灯亮了,串口能打印,但一到PWM输出就犯难——示波器上波形要么根本不出,要么频率死在1kHz动不了&a…

作者头像 李华