用于数据过滤的SAP CPI Groovy脚本

2020-08-31 21:02发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

我需要过滤从成功因素获得的有效负载中的记录。

在某些情况下,我必须删除一条记录并将其附加到文件末尾。

请让我知道如何在SAP CPI Integration流中实现这一目标。

此致

Shruthi

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

我需要过滤从成功因素获得的有效负载中的记录。

在某些情况下,我必须删除一条记录并将其附加到文件末尾。

请让我知道如何在SAP CPI Integration流中实现这一目标。

此致

Shruthi

付费偷看设置
发送
4条回答
打个大熊猫
1楼 · 2020-08-31 21:17.采纳回答

Hello Shruthi,

下面的解决方案应该可以工作(在下面的示例中,我要删除员工ID为E4的记录)

输入XML:

 
 <记录>
  E1 
  BLR 
  Sriprsad 
 <姓氏> Bhat 
  Shivaram 
  sri@test.com 
 
 <记录>
  E2 
  GGN 
  Praveen 
  R 
  T 
  praveen@test.com 
 
 <记录>
  E3 
  DEL 
  Rahul 
 <姓氏>辛格
  Markand 
  rahul@test.com 
 
 <记录>
  E4 
  CHN 
  Marko 
 <姓氏> Chacko 
 凯尔
  Marko@test.com 
 
 
 

脚本:

导入com.sap.gateway.ip.core.customdev.util.Message;
 导入java.util.HashMap;
 导入groovy.xml.XmlUtil;
 导入groovy.xml.StreamingMarkupBuilder;
 导入groovy.xml。*;

 def消息processData(消息消息){
      //身体
       def主体= message.getBody();
       def list =新的XmlParser()。parseText(body)
       def nodeToDel = list.Record.find {it.EmployeeID.text()=='E4'}
       def父= nodeToDel.parent()
       parent.remove(nodeToDel)
       def valid_data = XmlUtil.serialize(列表)
       def Deleted_data = XmlUtil.serialize(nodeToDel);
       message.setProperty(" deleted_records",Deleted_data);
       message.setBody(valid_data);
       返回消息;
 }
 

输出XML(有效记录):

 <?xml version =" 1.0" encoding =" UTF-8"?>
 <根>
 <记录>
  E1 
  BLR 
  Sriprsad 
  Bhat 
  Shivaram 
  sri@test.com 
 
 <记录>
  E2 
  GGN 
  Praveen 
  R 
  T 
  praveen@test.com 
 
 <记录>
  E3 
  DEL 
  Rahul 
 <姓氏>辛格
  Markand 
  rahul@test.com 
 
 
 

输出XML(已删除的节点):

已删除的节点数据将存储在属性:$ {property.deleted_records}中,可以根据需要在以后的时间点进行检索

 <?xml版本=" 1.0"编码=" UTF-8"?>
 <记录>
  E4 
  CHN 
  Marko 
 <姓氏> Chacko 
 凯尔
  Marko@test.com 
 
 

问候,

Sriprasad Shivaram Bhat

野沐沐
2楼-- · 2020-08-31 21:12

...,请注意employeeID字符串中的其他前导空格!

# p#

你好Shruthi,

能否请您共享一些示例XML,以及您希望在什么基础上删除节点。还要让我知道您要在对有效值进行最终转换后合并两个记录 记录?

问候,

Sriprasad Shivaram Bhat

小c菟菟
3楼-- · 2020-08-31 21:34

嗨,Sirprasad,

从SF系统中获取数据后,我将使用XSLT映射将其转换为xml。在XSLT映射之后,我将尝试使用消息映射将其转换为预期的输出格式。

数据格式如下

<位置名称> -------

我想解析该xml并检查一个员工ID。必须删除该记录并追加到文件底部。

在消息映射步骤之后,我尝试在Groovy脚本中执行此操作。

导入com.sap.gateway.ip.core.customdev.util.Message;

导入groovy.xml.XmlUtil;

导入groovy.xml.StreamingMarkupBuilder;

导入groovy.xml。*;

def消息processData(消息消息){

def body = message.getBody(java.lang.String)as String;

xml =新的XmlParser()。parseText(body)

def record = xml.depthFirst()。find {r-> r.EmployeeID ==" 123456"

record.replaceNode {}

xml.appendNode {记录}

message.setBody(XmlUtil.serialize(xml));

返回消息; }

当我尝试替换节点时,我得到了一个空指针异常。

请帮助。

野沐沐
4楼-- · 2020-08-31 21:09

您好Shruthi

replaceNode需要一个新节点,该节点用于替换您要对其应用的节点。 我认为您打算改用"删除"方法。 您必须在要删除的节点的父节点上调用它。 示例(我尚未在您的代码中尝试过):

  def父= record.parent()
 parent.remove(记录) 

一周热门 更多>