SAP 将ITAB内表的数据转换为XML字符串 代码实例

一、将ABAP数据生成XML文件且生成到本地
二、将XML文件解析到SAP中
三、将XML数据生成字符串
四、用XSLT的方式解析、生成XML,自定义XSLT的事务代码是strans
五、下面是具体实现代码
type-pools: IXML,ABAP.
types: begin of XML_LINE,
        DATA(256) type X,
       end of XML_LINE.
data: L_IXML            type ref to IF_IXML,
      L_STREAMFACTORY   type ref to IF_IXML_STREAM_FACTORY,
      L_OSTREAM         type ref to IF_IXML_OSTREAM,
      L_RENDERER        type ref to IF_IXML_RENDERER,
      L_DOCUMENT        type ref to IF_IXML_DOCUMENT.
data: L_ELEMENT_FLIGHTS type ref to IF_IXML_ELEMENT,
      L_ELEMENT_AIRLINE type ref to IF_IXML_ELEMENT,
      L_ELEMENT_FLIGHT  type ref to IF_IXML_ELEMENT,
      L_ELEMENT_DUMMY   type ref to IF_IXML_ELEMENT,
      L_VALUE           type STRING.
data: L_XML_TABLE       type table of XML_LINE,
      L_XML_SIZE        type I,
      L_RC              type I.
data: LT_SPFLI          type table of SPFLI.
data: L_SPFLI           type SPFLI.

start-of-selection.
*   Fill the internal table
  select * from SPFLI into table LT_SPFLI.

*   Sort internal table
  sort LT_SPFLI by CARRID.

* 生成XML数据
  loop at LT_SPFLI into L_SPFLI.

    at first.
*       Creating a ixml factory
      L_IXML = CL_IXML=>CREATE( ).
*       Creating the dom object model
      L_DOCUMENT = L_IXML->CREATE_DOCUMENT( ).
*       Fill root node with value flow
      L_ELEMENT_FLIGHTS  = L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                  NAME = 'flow'
                  PARENT = L_DOCUMENT ).


      L_RC = L_ELEMENT_FLIGHTS->SET_ATTRIBUTE( NAME = 'KEY' VALUE = 'gsgs-cgdd' ).
      L_RC = L_ELEMENT_FLIGHTS->SET_ATTRIBUTE( NAME = 'DES' VALUE = '广深公司-采购订单').
      L_RC = L_ELEMENT_FLIGHTS->SET_ATTRIBUTE( NAME = 'BAPI' VALUE ='ZBAPI_MM_RK_AFTER_APP' ).

      L_ELEMENT_AIRLINE  = L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                  NAME = 'customform'
                  PARENT = L_ELEMENT_FLIGHTS  ).
    endat.

    at new CONNID.

      L_ELEMENT_FLIGHT  = L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                  NAME = 'fd'
                  PARENT = L_ELEMENT_AIRLINE  ).

      L_VALUE = L_SPFLI-CONNID.
      L_RC = L_ELEMENT_FLIGHT->SET_ATTRIBUTE( NAME = 'n' VALUE =
'flight' ).
    endat.

    L_VALUE = L_SPFLI-DEPTIME.
    L_ELEMENT_DUMMY  = L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                NAME = 'V'
                VALUE = L_VALUE
                PARENT = L_ELEMENT_FLIGHT ).
  endloop.
*   Creating a stream factory
  L_STREAMFACTORY = L_IXML->CREATE_STREAM_FACTORY( ).
*   Connect internal XML table to stream factory
  L_OSTREAM = L_STREAMFACTORY->CREATE_OSTREAM_ITABLE( TABLE =
L_XML_TABLE ).
*   Rendering the document
  L_RENDERER = L_IXML->CREATE_RENDERER( OSTREAM  = L_OSTREAM
                                        DOCUMENT = L_DOCUMENT ).
  L_RC = L_RENDERER->RENDER( ).

*************************************************************
*   将xml数据导出到本地
*   取得XML数据大小
  L_XML_SIZE = L_OSTREAM->GET_NUM_WRITTEN_RAW( ).
*   将xml数据导出到本地
*  call method CL_GUI_FRONTEND_SERVICES=>GUI_DOWNLOAD
*    exporting
*      BIN_FILESIZE = L_XML_SIZE
*      FILENAME     = 'E:\flights.xml'
*      FILETYPE     = 'BIN'
*    changing
*      DATA_TAB     = L_XML_TABLE
*    exceptions
*      others       = 24.
*  if SY-SUBRC <> 0.
*    message id SY-MSGID type SY-MSGTY number SY-MSGNO
*               with SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
*  endif.
************************************************************

****************************************************
**--将XML数据导入到内表
*  data XMLDATA type XSTRING .
*  data: RESULT_XML type standard table of SMUM_XMLTB .
*  data: RETURN type standard table of BAPIRET2 .
*  data: WA_XML type SMUM_XMLTB.
*
*如果需要上载XML可以用一下方法
*  call function 'GUI_UPLOAD'
*    exporting
*      FILENAME   = 'E:\flights.xml'
*      FILETYPE   = 'BIN'
*    importing
*      FILELENGTH = L_XML_SIZE
*    tables
*      DATA_TAB   = L_XML_TABLE.

**--将XML数据导入到内表
*  call function 'SCMS_BINARY_TO_XSTRING'
*    exporting
*      INPUT_LENGTH = L_XML_SIZE
*    importing
*      BUFFER       = XMLDATA
*    tables
*      BINARY_TAB   = L_XML_TABLE
*    exceptions
*      FAILED       = 1
*      others       = 2.
*
*  call function 'SMUM_XML_PARSE'
*    exporting
*      XML_INPUT = XMLDATA
*    tables
*      XML_TABLE = RESULT_XML
*      RETURN    = RETURN.
*
*  loop at RESULT_XML into WA_XML .
*  endloop.



************************************************

**************************************************
*将XML转换成字符串
  data: W_STRING type XSTRING.
  data LS_XML type STRING.

*将XML转换成字符串
  call function 'SDIXML_DOM_TO_XML'
    exporting
      DOCUMENT      = L_DOCUMENT
    importing
      XML_AS_STRING = W_STRING
      SIZE          = L_XML_SIZE
    tables
      XML_AS_TABLE  = L_XML_TABLE
    exceptions
      NO_DOCUMENT   = 1
      others        = 2.
  if SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  endif.

* 将Xstring转换成二进制
*  call function 'SCMS_XSTRING_TO_BINARY'
*    exporting
*      BUFFER        = W_STRING
*    importing
*      OUTPUT_LENGTH = L_XML_SIZE
*    tables
*      BINARY_TAB    = L_XML_TABLE.

  call function 'SCMS_BINARY_TO_STRING'
    exporting
      INPUT_LENGTH = L_XML_SIZE
    importing
      TEXT_BUFFER  = LS_XML
    tables
      BINARY_TAB   = L_XML_TABLE
    exceptions
      FAILED       = 1
      others       = 2.

  if SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  endif.
****************************************************************

*******************************************************************
** 用XSLT的方式解析、生成XML
*  data LT_TABLE type standard table of CHAR2048.
*  data: GT_RESULT_XML type ABAP_TRANS_RESBIND_TAB,
*        GS_RESULT_XML type ABAP_TRANS_RESBIND.
*data   lo_oref   TYPE REF TO cx_root.
*  try.
*      call transformation ID "此ID是transformation,也可以用事务代码strans自定义一个transformation
*        source xml LT_TABLE
*        result (GT_RESULT_XML) .
*
*    catch CX_ST_ERROR into LO_OREF.
**      LS_MSG-MSGTYP = 'E'.
**      LS_MSG-MSGNO  = '000'.
**      LS_MSG-MSGTXT = LO_OREF->GET_TEXT( ).
**      append LS_MSG to C_MSGOUT.
*  endtry.
生成XML文件ABAP程序 REPORT zams_xml_dom_create . TYPE-POOLS: ixml. CLASS cl_ixml DEFINITION LOAD. TYPES: BEGIN OF xml_line, data(256) TYPE x, END OF xml_line. DATA: l_ixml TYPE REF TO if_ixml, l_streamfactory TYPE REF TO if_ixml_stream_factory, l_ostream TYPE REF TO if_ixml_ostream, l_renderer TYPE REF TO if_ixml_renderer, l_document TYPE REF TO if_ixml_document. DATA:l_element_ArchiveBatch TYPE REF TO if_ixml_element, l_element_BatchNumber TYPE REF TO if_ixml_element, l_element_TotalFiles TYPE REF TO if_ixml_element, l_element_TotalVolumes TYPE REF TO if_ixml_element, l_element_TotalPieces TYPE REF TO if_ixml_element, l_element_Entries TYPE REF TO if_ixml_element, l_element_Entry TYPE REF TO if_ixml_element, l_element_RecordsCombiningType TYPE REF TO if_ixml_element, l_element_FilePath TYPE REF TO if_ixml_element, l_element_SourceFileName TYPE REF TO if_ixml_element, l_element_ClassificationCode TYPE REF TO if_ixml_element, l_element_ElectronicRecordCode TYPE REF TO if_ixml_element, l_value TYPE string, l_name type string. DATA: l_xml_table TYPE TABLE OF xml_line, l_xml_size TYPE i, l_rc TYPE i. START-OF-SELECTION. *Creating a ixml factory l_ixml = cl_ixml=>create( ). *Creating the dom object model l_document = l_ixml->create_document( ). *Fill root node with value ArchiveBatch l_element_ArchiveBatch = l_document->create_simple_element( name = 'ArchiveBatch' parent = l_document ). * clear l_value. * l_value = '"http://www.w3.org/2001/XMLSchema-instance"'. * l_rc = l_element_ArchiveBatch->set_attribute( name = 'xmlns: *xsi' * value = l_value ). * * clear l_value. * concatenate '"D:\dev\vs\projects\AMS\DotNet\Sinopec.Ams.' * 'Integration\bin\Debug\config\AmsIntegration.xsd"' * into l_value. * l_name = 'xsi:noNamespaceSchemaLocation'. * l_rc = l_element_ArchiveBatch->set_attribute( name = l_name *value = l_value ). *BatchNumber l_element_BatchNumber = l_document->create_simple_element( name = 'BatchNumber' value = '20100609001' parent = l_element_ArchiveBatch ). *TotalFiles l_element_TotalFiles = l_document->create_simple_element( name = 'TotalFiles' value = '5' parent = l_element_ArchiveBatch ). *TotalVolumes l_element_TotalVolumes = l_document->create_simple_element( name = 'TotalVolumes' value = '3' parent = l_element_ArchiveBatch ). *TotalPieces l_element_TotalPieces = l_document->create_simple_element( name = 'TotalPieces' value = '5' parent = l_element_ArchiveBatch ). *Entries l_element_Entries = l_document->create_simple_element( name = 'Entries' parent = l_element_ArchiveBatch ). *Entry1 l_element_Entry = l_document->create_simple_element( name = 'Entry' parent = l_element_Entries ). *Entry1下面的子项 *RecordsCombiningType l_element_RecordsCombiningType = l_document->create_simple_element( name = 'RecordsCombiningType' value = 'Volume' parent = l_element_Entry ). *FilePath l_element_FilePath = l_document->create_simple_element( name = 'FilePath' value = '全宗001/目录001/案卷001/档案一.docx' parent = l_element_Entry ). *SourceFileName l_element_SourceFileName = l_document->create_simple_element( name = 'SourceFileName' value = '档案一' parent = l_element_Entry ). *ClassificationCode l_element_ClassificationCode = l_document->create_simple_element( name = 'ClassificationCode' value = 'wenshu' parent = l_element_Entry ). *ElectronicRecordCode l_element_ElectronicRecordCode = l_document->create_simple_element( name = 'ElectronicRecordCode' value = 'BJSH-001' parent = l_element_Entry ). *Entry1 * Creating a stream factory l_streamfactory = l_ixml->create_stream_factory( ). * Connect internal XML table to stream factory l_ostream = l_streamfactory->create_ostream_itable( table = l_xml_table ). * Rendering the document l_renderer = l_ixml->create_renderer( ostream = l_ostream document = l_document ). l_rc = l_renderer->render( ). * Saving the XML document l_xml_size = l_ostream->get_num_written_raw( ). CALL METHOD cl_gui_frontend_services=>gui_download EXPORTING bin_filesize = l_xml_size filename = 'c:\temp\metas.xml' filetype = 'BIN' CHANGING data_tab = l_xml_table EXCEPTIONS OTHERS = 24. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值