Не совсем то что нужно, но может пригодится. В свое время делал программу для выгрузки таблиц в xml и последующей загрузки для переноса данных между системами
Code:
REPORT z_table_download.
PARAMETERS: ptab2xml TYPE c RADIOBUTTON GROUP radi,
pxml2tab TYPE c RADIOBUTTON GROUP radi.
PARAMETERS: p_file_n TYPE localfile.
PARAMETERS: p_tab_nm TYPE tabname.
FIELD-SYMBOLS: <gt_data> TYPE table.
*----------------------------------------------------------------------*
END-OF-SELECTION.
* В версии > 4.6 вместо PERFORM create_dyn_table можно сделать проще -
* create data it_tab type table of (p_tab_nm).
PERFORM create_dyn_table.
IF ptab2xml = 'X'.
PERFORM download_xml.
ELSEIF pxml2tab ='X'.
PERFORM upload_xml.
ENDIF.
*----------------------------------------------------------------------*
FORM create_dyn_table.
DATA: lt_tab TYPE REF TO data,
lt_source TYPE TABLE OF rssource-line WITH HEADER LINE,
l_name(8) TYPE c.
lt_source = 'program zlr.'. APPEND lt_source.
CONCATENATE 'data: it_tab type table of ' p_tab_nm '.'
INTO lt_source SEPARATED BY space.
APPEND lt_source.
lt_source = 'form e_p changing c_tab.'. APPEND lt_source.
lt_source = ' GET REFERENCE OF it_tab INTO c_tab.'. APPEND lt_source.
lt_source = 'ENDFORM.'. APPEND lt_source.
GENERATE SUBROUTINE POOL lt_source NAME l_name.
IF sy-subrc = 0.
PERFORM e_p IN PROGRAM (l_name) CHANGING lt_tab.
ENDIF.
ASSIGN lt_tab->* TO <gt_data>.
ENDFORM. "create_dyn_table
*----------------------------------------------------------------------*
FORM download_xml.
DATA: l_dom TYPE REF TO if_ixml_element,
l_document TYPE REF TO if_ixml_document,
l_ixml TYPE REF TO if_ixml,
l_string TYPE xstring,
l_size TYPE i,
lt_xml TYPE dcxmllines,
l_rc LIKE sy-subrc,
xml TYPE dcxmllines,
table_name TYPE string,
BEGIN OF xml_tab OCCURS 0,
d TYPE LINE OF dcxmllines,
END OF xml_tab.
SELECT *
FROM (p_tab_nm)
INTO TABLE <gt_data>.
CLASS cl_ixml DEFINITION LOAD.
l_ixml = cl_ixml=>create( ).
CHECK NOT l_ixml IS INITIAL.
l_document = l_ixml->create_document( ).
DATA encoding TYPE REF TO if_ixml_encoding.
encoding = l_ixml->create_encoding( character_set = 'windows-1251'
byte_order = 0 ).
CHECK NOT l_document IS INITIAL.
CALL METHOD l_document->set_encoding
EXPORTING
encoding = encoding.
WRITE: / 'Converting DATA TO DOM 1:'.
table_name = p_tab_nm.
CALL FUNCTION 'SDIXML_DATA_TO_DOM'
EXPORTING
name = table_name
dataobject = <gt_data>
IMPORTING
data_as_dom = l_dom
CHANGING
document = l_document
EXCEPTIONS
illegal_name = 1
OTHERS = 2.
IF sy-subrc = 0.
WRITE 'Ok'.
ELSE.
WRITE: 'Err =', sy-subrc.
ENDIF.
CHECK NOT l_dom IS INITIAL.
l_rc = l_document->append_child( new_child = l_dom ).
IF l_rc IS INITIAL.
WRITE 'Ok'.
ELSE.
WRITE: 'Err =', l_rc.
ENDIF.
CALL FUNCTION 'SDIXML_DOM_TO_XML'
EXPORTING
document = l_document
pretty_print = 'X'
IMPORTING
xml_as_string = l_string
size = l_size
TABLES
xml_as_table = lt_xml
EXCEPTIONS
no_document = 1
OTHERS = 2.
IF sy-subrc = 0.
WRITE 'Ok'.
ELSE.
WRITE: 'Err =', sy-subrc.
ENDIF.
LOOP AT lt_xml INTO xml_tab-d.
APPEND xml_tab.
ENDLOOP.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
bin_filesize = l_size
filename = p_file_n
filetype = 'BIN'
TABLES
data_tab = xml_tab
EXCEPTIONS
OTHERS = 10.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. "download_xml
*&---------------------------------------------------------------------*
FORM upload_xml.
TYPES: BEGIN OF xml_line,
data(256) TYPE x,
END OF xml_line.
DATA: pixml TYPE REF TO if_ixml,
pdocument TYPE REF TO if_ixml_document,
pstreamfactory TYPE REF TO if_ixml_stream_factory,
pistream TYPE REF TO if_ixml_istream,
pparser TYPE REF TO if_ixml_parser,
string TYPE string,
count TYPE i,
index TYPE i,
totalsize TYPE i,
xml_table TYPE TABLE OF xml_line,
l_dom TYPE REF TO if_ixml_element.
IF p_tab_nm(1) NA 'ZY'.
MESSAGE e002(sy) WITH 'Обновление стандартных таблиц не разрешено'.
ENDIF.
SELECT COUNT(*)
FROM (p_tab_nm).
IF sy-dbcnt > 0.
MESSAGE e002(sy) WITH 'Таблица уже содержит данные'.
ENDIF.
CALL FUNCTION 'WS_UPLOAD'
EXPORTING
filename = p_file_n
filetype = 'BIN'
IMPORTING
filelength = totalsize
TABLES
data_tab = xml_table
EXCEPTIONS
OTHERS = 11.
IF sy-subrc <> 0.
EXIT.
ENDIF.
pixml = cl_ixml=>create( ).
*-- create the initial document
pdocument = pixml->create_document( ).
*-- create the stream factory
pstreamfactory = pixml->create_stream_factory( ).
*-- create an input stream for the table
pistream = pstreamfactory->create_istream_itable( table = xml_table
size = totalsize ).
*-- create the parser
pparser = pixml->create_parser( stream_factory = pstreamfactory
istream = pistream
document = pdocument ).
*-- parse the stream
IF pparser->parse( ) NE 0.
IF pparser->num_errors( ) NE 0.
count = pparser->num_errors( ).
WRITE: count, ' parse errors have occured:'.
DATA: pparseerror TYPE REF TO if_ixml_parse_error,
i TYPE i.
index = 0.
WHILE index < count.
pparseerror = pparser->get_error( index = index ).
i = pparseerror->get_line( ).
WRITE: 'line: ', i.
i = pparseerror->get_column( ).
WRITE: 'column: ', i.
string = pparseerror->get_reason( ).
WRITE: string.
index = index + 1.
ENDWHILE.
ENDIF.
ENDIF.
*-- we don't need the stream any more, so let's close it...
CALL METHOD pistream->close( ).
CLEAR pistream.
CALL METHOD pdocument->get_root_element
RECEIVING
rval = l_dom.
CALL FUNCTION 'SDIXML_DOM_TO_DATA'
EXPORTING
data_as_dom = l_dom
IMPORTING
dataobject = <gt_data>.
MODIFY (p_tab_nm) FROM TABLE <gt_data>.
WRITE 'OK'.
ENDFORM. " upload_xml
в итоге получается xml такого вида
Code:
<?xml version="1.0" encoding="windows-1251"?>
<T000>
<item>
<MANDT>000</MANDT>
<MTEXT>SAP AG Konzern</MTEXT>
<ORT01>Walldorf</ORT01>
<MWAER>DEM</MWAER>
<CCCATEGORY>E</CCCATEGORY>
<CCCORACTIV>1</CCCORACTIV>
<CCIMAILDIS>X</CCIMAILDIS>
<CHANGEUSER>DEMUTH</CHANGEUSER>
<CHANGEDATE>2000-08-11</CHANGEDATE>
</item>
</T000>