Tiven Wang
Wang Tiven January 16, 2018
425 favorite favorites
bookmark bookmark
share share

SAP Cloud Integration 的 Message Mapping 工具是对 Message Body 数据转换 Data Transformation 的一种方式。它使用 XSD 文件对转换前和转换后的数据格式进行预定义,允许用户在转换前后字段之间进行映射,支持一对一,一对多,多对一的映射方式。一对一的方式自然是最简单的,不需要额外逻辑。但一对多和多对一需要用户设置自定义函数进行映射逻辑处理。阅读 Custom function with multiple output in Message Mapping

Data Format

转换后的数据格式要求如下:

<?xml version="1.0" encoding="utf-8"?>
<Campaigns>
  <Campaign>
    <CampaignId>123</CampaignId>
    <ExtCampaignId>456</ExtCampaignId>
    <Success>
      <AdServingSpendAmount>1</AdServingSpendAmount>
      <AdServingSpendAmtCrcyISOCode>str1234</AdServingSpendAmtCrcyISOCode>
      <Advertiser>1</Advertiser>
      <CampaignID>1</CampaignID>
      <CountryFreeText>str1234</CountryFreeText>
      <DeviceFreeText>str1234</DeviceFreeText>
      <ExternalCampaignID>1</ExternalCampaignID>
      <NumberOfClicks>1</NumberOfClicks>
      <NumberOfImpressions>1</NumberOfImpressions>
      <RegionFreeText>str1234</RegionFreeText>
      <SuccessDataDate>2018-01-18T12:12:12</SuccessDataDate>
    </Success>
  </Campaign>
</Campaigns>

其对应的 XSD, 可以使用在线工具生成 XSD Generator

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Campaigns">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Campaign" maxOccurs="unbounded" minOccurs="0">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:int" name="CampaignId"/>
              <xs:element type="xs:int" name="ExtCampaignId"/>
              <xs:element name="Success" maxOccurs="unbounded" minOccurs="0">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element type="xs:byte" name="AdServingSpendAmount"/>
                    <xs:element type="xs:string" name="AdServingSpendAmtCrcyISOCode"/>
                    <xs:element type="xs:byte" name="Advertiser"/>
                    <xs:element type="xs:byte" name="CampaignID"/>
                    <xs:element type="xs:string" name="CountryFreeText"/>
                    <xs:element type="xs:string" name="DeviceFreeText"/>
                    <xs:element type="xs:byte" name="ExternalCampaignID"/>
                    <xs:element type="xs:byte" name="NumberOfClicks"/>
                    <xs:element type="xs:byte" name="NumberOfImpressions"/>
                    <xs:element type="xs:string" name="RegionFreeText"/>
                    <xs:element type="xs:dateTime" name="SuccessDataDate"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

转换前的数据如下:

<body>
  <data>
    <id>74524861</id>
    <kpis>1150</kpis>
    <kpis>7</kpis>
    <kpis>53.94</kpis>
    <name>bj-国际01</name>
    <name>通用词-北京</name>
    <date>2017-11-01</date>
    <device>1</device>
  </data>
</body>

其对应的 XSD 如下:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="body">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="data" maxOccurs="unbounded" minOccurs="0">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:int" name="id"/>
              <xs:element type="xs:float" name="kpis" maxOccurs="unbounded" minOccurs="0"/>
              <xs:element type="xs:string" name="name" maxOccurs="unbounded" minOccurs="0"/>
              <xs:element type="xs:date" name="date"/>
              <xs:element type="xs:byte" name="device"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Mapping Functions

SAP Cloud Integration Platform 提供了一些基本的数据转换函数可以使用在一对一的映射上。例如 Arithmetic 算术类的,Boolean 类的,Date 日期类的,Statistic 统计类的等等。你也可以在目标数据结构上 disable 掉不需要的字段,还可以为字段设置固定值。

我们重点介绍一些如何使用脚本文件为映射创建自定义函数。

Custom Function

先来看一下自定义函数 Overview

Image: SAP Cloud Integration - Message Mapping

点击Functions里创建按钮新建一个脚本文件,并创建函数 customKpis

import com.sap.it.api.mapping.*;

/*Add MappingContext parameter to read or set headers and properties
def String customFunc1(String P1,String P2,MappingContext context) {
         String value1 = context.getHeader(P1);
         String value2 = context.getProperty(P2);
         return value1+value2;
}

Add Output parameter to assign the output value.
def void custFunc2(String P1,String P2, Output output, MappingContext context) {
        String value1 = context.getHeader(P1);
        String value2 = context.getProperty(P2);
        output.addValue(value1);
        output.addValue(value2);
}*/

def void customKpis(String[] kpis, Output numberOfClicks, Output numberOfImpressions, MappingContext context){
    numberOfClicks.addValue(kpis[0]);
    numberOfImpressions.addValue(kpis[1]);
}

在此自定义函数的参数里你可以定义不同类型不同数量的输入和输出参数,这些参数会出现在图形界面里供字段映射使用。接着就可以把此函数添加到指定的映射上,并且添加更多的输入和输出参数进来,然后与函数的参数连接起来。

我们例子中的 kpis 这个 node 是一个 0..* 的节点,它会在 data 节点下出现多次,所以它对应到的参数会是一个数据类型,对于数据类型我们只能根据顺序判断它所对应的字段。

Many to One

上面我们讲到的设计到一对一和一对多的映射,那么对于多对一的映射有一些特殊设置。

例如我们需要将路径 /body/data/id 指向的值连接起来放在目标结构的 CampaignId 里,这里就涉及一个问题,路径 /body/data 映射的目标路径是 /Campaigns/Campaign/Success, 而现在要将 /body/data/id 映射到 /Campaigns/Campaign/CampaignId 上,/body/data/id 的取值要跨 /body/data List 。这里就需要将 /body/data/id 的属性里的 Context 设置为 body 而不是原来的 data

One to Many

对于一对多的映射有一个特殊情景,当一是某个 Node 而多是此 Node 的 Subtree 对应的 NodeList 时,例如一个 Document 的 Header 属性要映射到目标结构 TargetDocument 的 Items 下的某个属性上,这时就需要一个特别的函数 useOneAsMany

它的文档是这么说明的:Use first argument as it is on the same level as third one. The second argument defines when the next value of first argument should be taken. 解释一下是,First argument 对应源结构的某个 Node ,Third argument 对应 Subtree 下的某个 Node ,Second argument 对应 Subtree 的 Node 。用计算机语言表达为

loop input2
  when isLevelOfTarget(input3)
    yeild input1

Simulation

当你设计好 Message Mapping 后可以使用 Simulation 功能来测试一下,通过上传测试数据文件并点击 Test 进行测试并查看生成出来的数据结果。[ 1 ]

References

Similar Posts

  • SAP Cloud Platform Integration - Content Enricher How do we communicate with another system if the message originator does not have all the required data items available? Use a specialized transformer, a Content Enricher, to access an external data source in order to augment a message with missing information.
  • Apache Camel - Error Handling .
  • Apache Camel - Transforming Data Camel 是企业系统之间的数据交换中心,面对繁杂的多种多样的数据类型自然会有一套数据转换的能力。Camel 支持不同的数据转换方式,它提供了很多现成的组件对常见数据类型进行转换
  • Apache Camel in Action .
  • Apache Camel - Component - Quartz The quartz: component provides a scheduled delivery of messages using the Quartz Scheduler 1.x . Each endpoint represents a different timer (in Quartz terms, a Trigger and JobDetail).
  • Apache Camel - Scripting Camel supports a number of scripting languages which can be used to create an Expression or Predicate via the standard JSR 223 which is a standard part of Java 6.

Comments

Back to Top