尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

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

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 }
返回列表