SAP中XML文件与内表的相互转换

SAP中XML文件与内表的相互转换

最近在做和银行的对接,公司以前的业务并未涉及xml,于是将搜集的知识进行整合,书写一版简单的范例以供参考。

XML模板定义

TCode:STRANS

创建xml文件模板,命名为ZXML*.

<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates">
<!--内表变量名,可以为多个 -->
<tt:root name="itmara"/>

<tt:template>
    <Products>
    <!-- 循环体 name与内表名一致-->
        <tt:loop name="line" ref="itmara">
            <Product>
                <matnr>
                <!-- ref的值应为内表中的字段名 -->
                  <tt:value ref="$line.matnr"/>
                </matnr>
                <maktx>
                  <tt:value ref="$line.maktx"/>
                </maktx>
            </Product>
        </tt:loop>
    </Products>

</tt:template>

</tt:transform>

创建测试程序

*&---------------------------------------------------------------------*
*& Report  ZSKGJ_DOWNLOAD_DETAIL
*&
*&---------------------------------------------------------------------*
*& 收款管家下载交易明细
*& 2017-08-14 13:58:11
*&---------------------------------------------------------------------*

REPORT  ZSKGJ_DOWNLOAD_DETAIL.

DATA:p_client TYPE REF TO IF_HTTP_CLIENT.
DATA:p_data TYPE string,
     l_bindata type xstring,
     l_cntbin TYPE sdokcntbins,

DATA:  BEGIN OF it_xml OCCURS 0,
         line(100) TYPE c,
       END OF it_xml.
DATA: w_xml TYPE string,
      w_len TYPE i,
      w_fname TYPE string.
DATA: BEGIN OF line  ,
        matnr LIKE mara-matnr ,
        maktx LIKE makt-maktx ,
      END OF line .
DATA: itab_matnr LIKE TABLE OF line.

START-OF-SELECTION.
  PERFORM getdata.
  PERFORM create_xml.
  PERFORM decod_xml.
*&---------------------------------------------------------------------*
*&      Form  GETDATA
*&---------------------------------------------------------------------*
*       查询数据
*----------------------------------------------------------------------*
FORM GETDATA .
SELECT matnr maktx FROM makt
  INTO TABLE itab_matnr
  UP TO 4 ROWS
  WHERE spras = '1' .
ENDFORM.                    " GETDATA
*&---------------------------------------------------------------------*
*&      Form  CREATE_XML
*&---------------------------------------------------------------------*
*       内表转换为XML字符串
*----------------------------------------------------------------------*
FORM CREATE_XML .
*  此处即创建的XML模板,SOURCE为待转换内表,RESULT XML即返回的XML字符串
  CALL TRANSFORMATION zskgj_request
    SOURCE itmara = itab_matnr
    RESULT XML w_xml.

*  将XML转换为binary,再转换为string,实现UTF-16转为UTF-8,最终将UTF-8替换为GB2312
  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
    EXPORTING
      BUFFER               = l_bindata
    IMPORTING
     OUTPUT_LENGTH         = w_len
    TABLES
      BINARY_TAB           = l_cntbin
            .
  IF sy-subrc = 0.
    CLEAR w_xml.
    CALL FUNCTION 'SCMS_BINARY_TO_STRING'
    EXPORTING
    INPUT_LENGTH = w_len
    IMPORTING
    TEXT_BUFFER = w_xml
    OUTPUT_LENGTH = w_len
    TABLES
    BINARY_TAB = l_cntbin.
    IF sy-subrc = 0.
      REPLACE 'UTF-8' WITH 'GB2312' INTO w_xml.
    ENDIF.
  ENDIF.
ENDFORM.                    " CREATE_XML
*&---------------------------------------------------------------------*
*&      Form  DECOD_XML
*&---------------------------------------------------------------------*
*       解码xml
*----------------------------------------------------------------------*
FORM DECOD_XML .
  DATA: lo_oref TYPE REF TO cx_st_error.
  DATA: lv_msg TYPE string.

  TRY .
    refresh itab_matnr.
    BREAK-POINT.
*    调用XML模板,数据源为XML字符串,返回结果至内表
    CALL TRANSFORMATION zskgj_request
    SOURCE XML w_xml
    RESULT itmara =  itab_matnr[].

  CATCH cx_st_error INTO lo_oref .
    CLEAR: lv_msg .
    lv_msg  = lo_oref->get_text( ) .
    WRITE: / 'Error message:',lv_msg.
ENDTRY.

ENDFORM.                    " DECOD_XML
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,907评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,805评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,279评论 18 399
  • 生活中有朋友戏称我为“古人”,因为我所热爱的小说,电影,音乐等绝大部分事物,在他们眼里是极其古老的。偏偏我还乐在其...
    今晚不打渔阅读 9,895评论 37 61
  • 爱是一门艺术吗? 如果爱是一门艺术,那就要求人们有这方面的知识并付出努力。 爱情不是一种与人的成熟程度无关,只需要...
    自制力才是超能力阅读 3,177评论 0 4

友情链接更多精彩内容