SAP中XML文件與內(nèi)表的相互轉(zhuǎn)換
最近在做和銀行的對接,公司以前的業(yè)務(wù)并未涉及xml,于是將搜集的知識進(jìn)行整合迁筛,書寫一版簡單的范例以供參考差购。
XML模板定義
TCode:STRANS
創(chuàng)建xml文件模板,命名為ZXML*.
<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates">
<!--內(nèi)表變量名解取,可以為多個 -->
<tt:root name="itmara"/>
<tt:template>
<Products>
<!-- 循環(huán)體 name與內(nèi)表名一致-->
<tt:loop name="line" ref="itmara">
<Product>
<matnr>
<!-- ref的值應(yīng)為內(nèi)表中的字段名 -->
<tt:value ref="$line.matnr"/>
</matnr>
<maktx>
<tt:value ref="$line.maktx"/>
</maktx>
</Product>
</tt:loop>
</Products>
</tt:template>
</tt:transform>
創(chuàng)建測試程序
*&---------------------------------------------------------------------*
*& Report ZSKGJ_DOWNLOAD_DETAIL
*&
*&---------------------------------------------------------------------*
*& 收款管家下載交易明細(xì)
*& 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
*&---------------------------------------------------------------------*
* 查詢數(shù)據(jù)
*----------------------------------------------------------------------*
FORM GETDATA .
SELECT matnr maktx FROM makt
INTO TABLE itab_matnr
UP TO 4 ROWS
WHERE spras = '1' .
ENDFORM. " GETDATA
*&---------------------------------------------------------------------*
*& Form CREATE_XML
*&---------------------------------------------------------------------*
* 內(nèi)表轉(zhuǎn)換為XML字符串
*----------------------------------------------------------------------*
FORM CREATE_XML .
* 此處即創(chuàng)建的XML模板,SOURCE為待轉(zhuǎn)換內(nèi)表,RESULT XML即返回的XML字符串
CALL TRANSFORMATION zskgj_request
SOURCE itmara = itab_matnr
RESULT XML w_xml.
* 將XML轉(zhuǎn)換為binary络凿,再轉(zhuǎn)換為string,實現(xiàn)UTF-16轉(zhuǎn)為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.
* 調(diào)用XML模板,數(shù)據(jù)源為XML字符串絮记,返回結(jié)果至內(nèi)表
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