一个简单的创建xml方式
DATA: BEGIN OF itab_matnr OCCURS 0 , matnr LIKE mara-matnr , maktx LIKE makt-maktx , END OF itab_matnr . DATA: BEGIN OF itab_class OCCURS 0 , class LIKE m_wwgha-class,"部门 kschl LIKE m_wwgha-kschl,"DESC END OF itab_class . DATA: l_ixml TYPE REF TO if_ixml, l_encoding TYPE REF TO if_ixml_encoding, l_comment TYPE REF TO if_ixml_comment, l_doc TYPE REF TO if_ixml_document, l_root TYPE REF TO if_ixml_element, l_item TYPE REF TO if_ixml_element, l_element TYPE REF TO if_ixml_element, l_attribute TYPE REF TO if_ixml_attribute, l_ostream TYPE REF TO if_ixml_ostream, l_factory TYPE REF TO if_ixml_stream_factory. TYPES: BEGIN OF xml_line, data(256) TYPE x, END OF xml_line. DATA: xml_table TYPE TABLE OF xml_line, xml_size TYPE i. DATA: l_rval TYPE i. START-OF-SELECTION. PERFORM getdata. PERFORM create_xml. PERFORM download. *---------------------------------------------------------------------* * FORM getdata * *---------------------------------------------------------------------* FORM getdata. SELECT matnr maktx FROM makt INTO TABLE itab_matnr UP TO 4 ROWS WHERE spras = '1' . SELECT class kschl FROM m_wwgha INTO TABLE itab_class UP TO 4 ROWS WHERE spras IN ('1','E') . DELETE itab_class WHERE class = '0'. APPEND itab_class. "演示空数据 ENDFORM. *---------------------------------------------------------------------* * FORM create_xml * *---------------------------------------------------------------------* FORM create_xml. CLASS cl_ixml DEFINITION LOAD. l_ixml = cl_ixml=>create( ). CALL METHOD l_ixml->create_encoding EXPORTING byte_order = 0 character_set = 'gb2312' RECEIVING rval = l_encoding . CALL METHOD l_ixml->create_document RECEIVING rval = l_doc . CALL METHOD l_doc->set_encoding EXPORTING encoding = l_encoding . CALL METHOD l_doc->create_simple_element EXPORTING name = 'Root' parent = l_doc RECEIVING rval = l_root . CALL METHOD l_root->set_attribute EXPORTING name = 'ATTRIBUTE' value = 'sample' RECEIVING rval = l_rval . CALL METHOD l_doc->create_comment EXPORTING comment = '''上面ATTRIBUTE为属性示例''' RECEIVING rval = l_comment . CALL METHOD l_root->append_child EXPORTING new_child = l_comment RECEIVING rval = l_rval. PERFORM fill_itab2xml TABLES itab_matnr USING 'Products' 'Product' l_root. PERFORM fill_itab2xml TABLES itab_class USING 'Categories' 'Categorie' l_root. CALL METHOD l_ixml->create_stream_factory RECEIVING rval = l_factory . CALL METHOD l_factory->create_ostream_itable EXPORTING table = xml_table RECEIVING rval = l_ostream . CALL METHOD l_doc->render EXPORTING ostream = l_ostream recursive = 'X' . CALL METHOD l_ostream->get_num_written_raw RECEIVING rval = xml_size . ENDFORM. *---------------------------------------------------------------------* * FORM download * *---------------------------------------------------------------------* FORM download. CALL FUNCTION 'GUI_DOWNLOAD' EXPORTING bin_filesize = xml_size filename = 'C:\ECC6.XML' filetype = 'BIN' TABLES data_tab = xml_table. ENDFORM. *---------------------------------------------------------------------* * FORM fill_itab * *---------------------------------------------------------------------* FORM fill_itab2xml TABLES intab USING node1name TYPE string node2name TYPE string l_parent TYPE REF TO if_ixml_element. DATA: BEGIN OF headtab OCCURS 0 , length TYPE i , decimals TYPE i, type_kind TYPE c, name(30) TYPE c, END OF headtab. DATA descr_ref TYPE REF TO cl_abap_structdescr. FIELD-SYMBOLS: <comp_wa> TYPE abap_compdescr , <f_field> , <f_intab> TYPE ANY . DATA: n TYPE i , str TYPE string , itemname TYPE string , text1 TYPE c , l_node TYPE REF TO if_ixml_element , l_item TYPE REF TO if_ixml_element . descr_ref ?= cl_abap_typedescr=>describe_by_data( intab ). LOOP AT descr_ref->components ASSIGNING <comp_wa>. MOVE-CORRESPONDING <comp_wa> TO headtab. APPEND headtab. ENDLOOP. CALL METHOD l_doc->create_simple_element EXPORTING name = node1name parent = l_parent RECEIVING rval = l_node . DESCRIBE TABLE headtab LINES n. LOOP AT intab ASSIGNING <f_intab>. CALL METHOD l_doc->create_simple_element EXPORTING name = node2name parent = l_node RECEIVING rval = l_item . DO n TIMES. ASSIGN COMPONENT sy-index OF STRUCTURE <f_intab> TO <f_field>. str = <f_field>. READ TABLE headtab INDEX sy-index. IF headtab-type_kind = 'I' OR headtab-type_kind = 'P' OR headtab-type_kind = 'F'. SEARCH str FOR '-'. IF sy-subrc = 0 AND sy-fdpos <> 0. SPLIT str AT '-' INTO str text1. CONDENSE str. CONCATENATE '-' str INTO str. ELSE. CONDENSE str. ENDIF. ELSE. * SHIFT str LEFT DELETING LEADING '0' . ENDIF. itemname = headtab-name . CALL METHOD l_doc->create_simple_element EXPORTING name = itemname parent = l_item value = str RECEIVING rval = l_element . ENDDO. ENDLOOP. ENDFORM.