SAP中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 zxml_skgj
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 zxml_skgj
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