Convert an ABAP table into XML file using SAP DOM Approach

原文地址: http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/2657

 

XML DOM Processing in ABAP part I - Convert an ABAP table into XML file using SAP DOM Approach.

 

Introduction

With NetWeaver 04 SAP introduced simple transformations, a new way of converting XML directly into ABAP tables, structures and fields. Tobias Trapp wrote 5 weblogs about this topic with the title XML processing in ABAP. However the success of these great weblogs, you must have at least a SAP WAS 6.40 environment and you have to learn the Simple Transformation Language. At first another solution was introduced by SAP into the SAP kernel of version 4.6D. This implementation is called the iXML package and could be accessed using and ABAP Object class CL_IXML and about 40 ABAP Object interfaces IF_IXML*. In this weblog I will focus on the possibilities of SAP XML Document Object Model (DOM) processing at the ABAP stack. My objective is to explain how you can use it in abap mapping. For this I split this weblog into three parts. This first part will focus on the conversion of an abap table into an xml file. The second part will focus on the conversion from an xml file (back) to abap tables. The last  part will deal with the use of SAP DOM within XI abap mapping, introduced with SAP XI 3.0.

The XML

In this weblog part we will create an xml file on the user’s computer based on data from an SAP system. First we will fill an internal table with SAP data.

image
Next we will create a document object using an iXML factory. This document can be filled with the data of the internal table. The document object can be represented as a tree structure, the so called Document Object Model or SAP DOM..

image

After filling the document object, we will transfer it into a XML stream. This stream is the binary version of the XML file and can be represented as a string, an xstring or a table with binary fields.

image
In the last step we will transfer the XML file to the user’s PC.

The implementation

In this implementation we will only focus on the creation of the XML file and the transfer to the user. You can not create a XML document directly. You have to use a so called ixml factory first.  

 TYPE-POOLS: ixml.
 DATA: l_ixml TYPE REF TO if_ixml.
 l_ixml = cl_ixml=>create( ).


This iXML factory can create an empty XML document object named l_document.

 DATA:  l_document TYPE REF TO if_ixml_document.
        l_document = l_ixml->create_document( ).


At this point you can add the nodes (elements, attributes) into the document. First you have to declare the root element node.

 DATA: l_element_root TYPE REF TO if_ixml_element.


This node we have to give a name and add it (create_simple_node) to the document object l_document, which will be the parent of this node.

 l_element_root  = l_document->create_simple_element(
            name = 'flights'
          parent = l_document ).


Next we can add child nodes to there parent node using the same method of the document object.

 DATA: l_element_airline TYPE REF TO if_ixml_element,
 l_element_airline  = l_document->create_simple_element(
               name = 'airline'
             parent = l_element_root  ).


An attribute can be add easily using the method set_attribute of the element node.

 l_rc = l_element_airline->set_attribute( name = 'code' value = 'LH401' ).


Now we have finished the document object. Regretfully it can not be displayed in any form due to the fact that it is a binary object.  
The next step is to convert the created document to a flat file. To achieve this we have to create a stream factory, which will help us to create an output stream.

 DATA: l_streamfactory   TYPE REF TO if_ixml_stream_factory.
 l_streamfactory = l_ixml->create_stream_factory( ).


In this case, we will convert the document into an output stream which is based on an internal table of type x.

 TYPES: BEGIN OF xml_line,
          data(256) TYPE x,
        END OF xml_line.
 DATA:  l_xml_table       TYPE TABLE OF xml_line,
        l_xml_size        TYPE i,
        l_rc              TYPE i,
        l_ostream         TYPE REF TO if_ixml_ostream.
 l_ostream = l_streamfactory->create_ostream_itable( table = l_xml_table ).


When we have created the output stream we can do the rendering from the document into the stream. The XML data will be stored in the internal table automatically.

 DATA: l_renderer        TYPE REF TO if_ixml_renderer.
 l_renderer = l_ixml->create_renderer( ostream  = l_ostream
                        & nbsp;              document = l_document ).
 l_rc = l_renderer->render( ).


In the last step we upload the file to the sapgui

 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/flights.xml'
     filetype     = 'BIN'
   CHANGING
     data_tab     = l_xml_table
   EXCEPTIONS
     OTHERS       = 24.



This finished the first step-of-three. As mentioned before the next log will focus on the conversion from xml files (back) to abap tables.

 

A complete example
ABAP Source

  REPORT  z_xit_xml_dom_create.

  TYPE-POOLS: ixml.

  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_from    TYPE REF TO if_ixml_element,
        l_element_to      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.

*   Start filling xml dom object from internal table
    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 flights
        l_element_flights  = l_document->create_simple_element(
                    name = 'flights'
                    parent = l_document ).
      ENDAT.

      AT NEW carrid.
*       Create element 'airline' as child of 'flights'
        l_element_airline  = l_document->create_simple_element(
                    name = 'airline'
                    parent = l_element_flights  ).

*       Create attribute 'code' of node 'airline'
        l_value = l_spfli-carrid.
        l_rc = l_element_airline->set_attribute( name = 'code' value = l_value ).

*       Create attribute 'name' of node 'airline'
        SELECT SINGLE carrname FROM scarr INTO l_value WHERE carrid EQ l_spfli-carrid.
        l_rc = l_element_airline->set_attribute( name = 'name' value = l_value ).

      ENDAT.

      AT NEW connid.
*       Create element 'flight' as child of 'airline'
        l_element_flight  = l_document->create_simple_element(
                    name = 'flight'
                    parent = l_element_airline  ).

*       Create attribute 'number' of node 'flight'
        l_value = l_spfli-connid.
        l_rc = l_element_flight->set_attribute( name = 'number' value = l_value ).

      ENDAT.

*     Create element 'from' as child of 'flight'
      CONCATENATE l_spfli-cityfrom ',' l_spfli-countryfr INTO l_value.
      l_element_from  = l_document->create_simple_element(
                  name = 'from'
                  value = l_value
                  parent = l_element_flight  ).

*     Create attribute 'airport' of node 'from'
      l_value = l_spfli-airpfrom.
      l_rc = l_element_from->set_attribute( name = 'airport' value = l_value ).

*     Create element 'to' as child of 'flight'
      CONCATENATE l_spfli-cityto ',' l_spfli-countryto INTO l_value.
      l_element_to  = l_document->create_simple_element(
                  name = 'to'
                  value = l_value
                  parent = l_element_flight  ).

*     Create attribute 'airport' of node 'from'
      l_value = l_spfli-airpto.
      l_rc = l_element_to->set_attribute( name = 'airport' value = l_value ).

*     Create element 'departure' as child of 'flight'
      l_value = l_spfli-deptime.
      l_element_dummy  = l_document->create_simple_element(
                  name = 'departure'
                  value = l_value
                  parent = l_element_flight ).

*     Create element 'arrival' as child of 'flight'
      l_value = l_spfli-arrtime.
      l_element_dummy  = l_document->create_simple_element(
                  name = 'arrival'
                  value = l_value
                  parent = l_element_flight ).

*     Create element 'type' as child of 'flight'
      CASE l_spfli-fltype.
        WHEN 'X'.
          l_value = 'Charter'.
        WHEN OTHERS.
          l_value = 'Scheduled'.
      ENDCASE.
      l_element_dummy  = l_document->create_simple_element(
                  name = 'type'
                  value = l_value
                  parent = l_element_flight ).
    ENDLOOP.
    IF sy-subrc NE 0.
      MESSAGE 'No data into db table ''spfli'', please run program ''SAPBC_DATA_GENERATOR'' with transaction ''SA38''' TYPE 'E'.
    ENDIF.


*   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/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 file

<?xml version="1.0"?>
<flights>
 <airline code="AA" name="American Airlines">
  <flight number="0017">
   <from airport="JFK">NEW YORK,US</from>
   <to airport="SFO">SAN FRANCISCO,US</to>
   <departure>110000</departure>
   <arrival>140100</arrival>
   <type>Scheduled</type>
  </flight>
  <flight number="0064">
   <from airport="SFO">SAN FRANCISCO,US</from>
   <to airport="JFK">NEW YORK,US</to>
   <departure>090000</departure>
   <arrival>172100</arrival>
   <type>Scheduled</type>
  </flight>
 </airline>
 <airline code="AZ" name="Alitalia">
  <flight number="0555">
   <from airport="FCO">ROME,IT</from>
   <to airport="FRA">FRANKFURT,DE</to>
   <departure>190000</departure>
   <arrival>210500</arrival>
   <type>Scheduled</type>
  </flight>
  <flight number="0788">
   <from airport="FCO">ROME,IT</from>
   <to airport="TYO">TOKYO,JP</to>
   <departure>120000</departure>
   <arrival>085500</arrival>
   <type>Scheduled</type>
  </flight>
  <flight number="0789">
   <from airport="TYO">TOKYO,JP</from>
   <to airport="FCO">ROME,IT</to>
   <departure>114500</departure>
   <arrival>192500</arrival>
   <type>Scheduled</type>
  </flight>
  <flight number="0790">
   <from airport="FCO">ROME,IT</from>
   <to airport="KIX">OSAKA,JP</to>
   <departure>103500</departure>
   <arrival>081000</arrival>
   <type>Charter</type>
  </flight>
 </airline>
 <airline code="DL" name="Delta Airlines">
  <flight number="1984">
   <from airport="SFO">SAN FRANCISCO,US</from>
   <to airport="JFK">NEW YORK,US</to>
   <departure>100000</departure>
   <arrival>182500</arrival>
   <type>Scheduled</type>
  </flight>
  <flight number="1699">
   <from airport="JFK">NEW YORK,US</from>
   <to airport="SFO">SAN FRANCISCO,US</to>
   <departure>171500</departure>
   <arrival>203700</arrival>
   <type>Scheduled</type>
  </flight>
  <flight number="0106">
   <from airport="JFK">NEW YORK,US</from>
   <to airport="FRA">FRANKFURT,DE</to>
   <departure>193500</departure>
   <arrival>093000</arrival>
   <type>Scheduled</type>
  </flight>
 </airline>
 <airline code="JL" name="Japan Airlines">
  <flight number="0407">
   <from airport="NRT">TOKYO,JP</from>
   <to airport="FRA">FRANKFURT,DE</to>
   <departure>133000</departure>
   <arrival>173500</arrival>
   <type>Scheduled</type>
  </flight>
  <flight number="0408">
   <from airport="FRA">FRANKFURT,DE</from>
   <to airport="NRT">TOKYO,JP</to>
   <departure>202500</departure>
   <arrival>154000</arrival>
   <type>Charter</type>
  </flight>
 </airline>
 <airline code="LH" name="Lufthansa">
  <flight number="2407">
   <from airport="TXL">BERLIN,DE</from>
   <to airport="FRA">FRANKFURT,DE</to>
   <departure>071000</departure>
   <arrival>081500</arrival>
   <type>Scheduled</type>
  </flight>
  <flight number="2402">
   <from airport="FRA">FRANKFURT,DE</from>
   <to airport="SXF">BERLIN,DE</to>
   <departure>103000</departure>
   <arrival>113500</arrival>
   <type>Scheduled</type>
  </flight>
  <flight number="0402">
   <from airport="FRA">FRANKFURT,DE</from>
   <to airport="JFK">NEW YORK,US</to>
   <departure>133000</departure>
   <arrival>150500</arrival>
   <type>Charter</type>
  </flight>
  <flight number="0401">
   <from airport="JFK">NEW YORK,US</from>
   <to airport="FRA">FRANKFURT,DE</to>
   <departure>183000</departure>
   <arrival>074500</arrival>
   <type>Scheduled</type>
  </flight>
  <flight number="0400">
   <from airport="FRA">FRANKFURT,DE</from>
   <to airport="JFK">NEW YORK,US</to>
   <departure>101000</departure>
   <arrival>113400</arrival>
   <type>Scheduled</type>
  </flight>
 </airline>
 <airline code="QF" name="Qantas Airways">
  <flight number="0005">
   <from airport="SIN">SINGAPORE,SG</from>
   <to airport="FRA">FRANKFURT,DE</to>
   <departure>225000</departure>
   <arrival>053500</arrival>
   <type>Scheduled</type>
  </flight>
  <flight number="0006">
   <from airport="FRA">FRANKFURT,DE</from>
   <to airport="SIN">SINGAPORE,SG</to>
   <departure>205500</departure>
   <arrival>150500</arrival>
   <type>Scheduled</type>
  </flight>
 </airline>
 <airline code="SQ" name="Singapore Airlines">
  <flight number="0988">
   <from airport="SIN">SINGAPORE,SG</from>
   <to airport="TYO">TOKYO,JP</to>
   <departure>163500</departure>
   <arrival>001500</arrival>
   <type>Scheduled</type>
  </flight>
  <flight number="0158">
   <from airport="SIN">SINGAPORE,SG</from>
   <to airport="JKT">JAKARTA,ID</to>
   <departure>152500</departure>
   <arrival>160000</arrival>
   <type>Scheduled</type>
  </flight>
  <flight number="0015">
   <from airport="SFO">SAN FRANCISCO,US</from>
   <to airport="SIN">SINGAPORE,SG</to>
   <departure>160000</departure>
   <arrival>024500</arrival>
   <type>Scheduled</type>
  </flight>
  <flight number="0002">
   <from airport="SIN">SINGAPORE,SG</from>
   <to airport="SFO">SAN FRANCISCO,US</to>
   <departure>170000</departure>
   <arrival>192500</arrival>
   <type>Scheduled</type>
  </flight>
 </airline>
 <airline code="UA" name="United Airlines">
  <flight number="0941">
   <from airport="FRA">FRANKFURT,DE</from>
   <to airport="SFO">SAN FRANCISCO,US</to>
   <departure>143000</departure>
   <arrival>170600</arrival>
   <type>Scheduled</type>
  </flight>
  <flight number="3504">
   <from airport="SFO">SAN FRANCISCO,US</from>
   <to airport="FRA">FRANKFURT,DE</to>
   <departure>150000</departure>
   <arrival>103000</arrival>
   <type>Scheduled</type>
  </flight>
  <flight number="3516">
   <from airport="JFK">NEW YORK,US</from>
   <to airport="FRA">FRANKFURT,DE</to>
   <departure>162000</departure>
   <arrival>054500</arrival>
   <type>Scheduled</type>
  </flight>
  <flight number="3517">
   <from airport="FRA">FRANKFURT,DE</from>
   <to airport="JFK">NEW YORK,US</to>
   <departure>104000</departure>
   <arrival>125500</arrival>
   <type>Scheduled</type>
  </flight>
 </airline>
</flights>

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
生成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.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值