Code:
FUNCTION zbc_xml_file.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" REFERENCE(PATH) TYPE LOCALFILE DEFAULT ''
*" REFERENCE(XSLT) TYPE STRING DEFAULT ''
*" TABLES
*" IT_DATA TYPE TABLE
*"----------------------------------------------------------------------
*---------------------------------------------------------------------*
* .DATA
*---------------------------------------------------------------------*
DATA: strm TYPE REF TO if_ixml_ostream,
size TYPE i VALUE 0.
DATA: s TYPE string.
DATA: parser TYPE string.
DATA: xmltab TYPE table_t.
*---------------------------------------------------------------------*
* .CODE
*---------------------------------------------------------------------*
IF path IS INITIAL.
PERFORM get_path USING path CHANGING s.
CHECK sy-subrc IS INITIAL.
ELSE.
s = path.
ENDIF.
*
g_ixml = cl_ixml=>create( ).
g_stream_factory = g_ixml->create_stream_factory( ).
g_encoding = g_ixml->create_encoding( character_set = encoding
byte_order = 0 ).
TRY.
REFRESH xmltab.
strm = g_stream_factory->create_ostream_itable( table = xmltab ).
strm->set_encoding( encoding = g_encoding ).
IF NOT it_data[] IS INITIAL.
* ABAP to XML
IF xslt IS INITIAL.
parser = 'ID_INDENT'.
ELSE.
parser = xslt.
ENDIF.
CALL TRANSFORMATION (parser)
SOURCE it_data = it_data[]
RESULT XML strm.
size = strm->get_num_written_raw( ).
PERFORM store_file USING s size xmltab.
ELSE.
* XML to ABAP
PERFORM load_file USING s CHANGING xmltab.
size = strm->get_num_written_raw( ).
IF xslt IS INITIAL.
parser = 'ZBC_XML_FILE'.
ELSE.
parser = xslt.
ENDIF.
CALL TRANSFORMATION (parser)
SOURCE XML xmltab
RESULT it_data = it_data[].
ENDIF.
CATCH cx_xslt_exception INTO xslt_err.
s = xslt_err->get_text( ).
MESSAGE e000 WITH s.
ENDTRY.
ENDFUNCTION.
ФМ для выгрузки/загрузки произвольной внутренней таблицы.
Если не передавать параметр XSLT - используется стандартное преобразование ID_INDENT.
А вот пример xslt, для преобразования к нужному формату.
Code:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
>
<xsl:strip-space elements="*"/>
<xsl:output encoding="utf-8" indent="no"/>
<!--comment-->
<xsl:template match="IT_DATA" name="material">
<asx:abap version="1.0" xmlns:asx="http://www.sap.com/abapxml">
<asx:values>
<materials>
<xsl:for-each select="ZSD_MATNR_XML_IMPORT">
<xsl:variable name="matnr" select="."/>
<material>
<MATNR>
<xsl:value-of select="$matnr/MATNR"/>
</MATNR>
<MAKTX>
<xsl:value-of select="$matnr/MAKTX"/>
</MAKTX>
<MENGE>
<xsl:value-of select="$matnr/MENGE"/>
</MENGE>
<MEINS>
<xsl:value-of select="$matnr/MEINS"/>
</MEINS>
</material>
</xsl:for-each>
</materials>
</asx:values>
</asx:abap>
</xsl:template>
</xsl:transform>