Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

How to create XML document?

Former Member
0 Kudos

Hallo everyone,

I have a question on creating XML document.

For example,

I want to convert a string 'ABC' to XML format

<A>

<B>

<C>

</C>

</B>

</A>

I know the class IF_IXML_NODE,IF_IXML_DOCUMENT, but I am not sure how to deal with them.

I did like this:

node TYPE REF TO IF_IXML_NODE.

docu TYPE REF TO IF_IXML_DOCUMENT.

docu->create_element( 'A' ).

docu->create_element( '/A' ).

docu->create_element( 'B' ).

docu->create_element( '/B' ).

docu->create_element( 'C' ).

docu->create_element( '/C' ).

node1->set_name( 'A' ).

node2->set_name( 'B' ).

node1->append_child( node2 ).

node3->set_name( 'C' ).

node2->append_child( node3 ).

But I am not sure if this way is correct?

It would be very nice when anynoe of you give some advise!

Thanks in advance!

Regards,

Liying

1 ACCEPTED SOLUTION

Former Member
7 REPLIES 7

Former Member

Former Member
0 Kudos

HI Liying,

Here is the sample code:

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.

0 Kudos

Thanks prabhakara rao ,

Thanks all u guys!I think I've got the point!

former_member927251
Active Contributor
0 Kudos

Hi,

1. Take all your data into internal table.

2. Convert internal table data to XML.

Here is the source code for the same.

*----


DATA

DATA : t001 LIKE TABLE OF t001 WITH HEADER LINE.

DATA : BEGIN OF itab OCCURS 0,

a(100) TYPE c,

END OF itab.

DATA: xml_out TYPE string .

DATA : BEGIN OF upl OCCURS 0,

f(255) TYPE c,

END OF upl.

DATA: xmlupl TYPE string .

                                                              • FIRST PHASE

                                                              • FIRST PHASE

                                                              • FIRST PHASE

*----


Fetch Data

SELECT * FROM t001 INTO TABLE t001.

*----


XML

CALL TRANSFORMATION ('ID')

SOURCE tab = t001[]

RESULT XML xml_out.

*----


Convert to TABLE

CALL FUNCTION 'HR_EFI_CONVERT_STRING_TO_TABLE'

EXPORTING

i_string = xml_out

i_tabline_length = 100

TABLES

et_table = itab.

*----


Download

CALL FUNCTION 'GUI_DOWNLOAD'

EXPORTING

filetype = 'BIN'

filename = 'd:\xx.xml'

TABLES

data_tab = itab.

                                                              • SECOND PHASE

                                                              • SECOND PHASE

                                                              • SECOND PHASE

BREAK-POINT.

REFRESH t001.

CLEAR t001.

CALL FUNCTION 'GUI_UPLOAD'

EXPORTING

filename = 'D:\XX.XML'

filetype = 'BIN'

TABLES

data_tab = upl.

LOOP AT upl.

CONCATENATE xmlupl upl-f INTO xmlupl.

ENDLOOP.

*----


XML

CALL TRANSFORMATION ('ID')

SOURCE XML xmlupl

RESULT tab = t001[]

.

BREAK-POINT.

<b>Please reward points if it helps.</b>

Regards,

Amit Mishra

Former Member
0 Kudos

Hai Liying Wang

This program exports an internal table to an XML file.

*----


*

  • Report ZPRUEBA_MML_13 *

  • Export an internal table to XML document *

  • NO BORRAR ESTE CODIGO *

*----


*

REPORT ZPRUEBA_MML_13.

*----


*

  • PANTALLA SELECCION *

PARAMETERS: GK_RUTA TYPE RLGRAP-FILENAME.

  • PANTALLA SELECCION *

*----


*

*----


*

  • TYPE TURNOS *

TYPES: BEGIN OF TURNOS,

LU LIKE T552A-TPR01,

MA LIKE T552A-TPR01,

MI LIKE T552A-TPR01,

JU LIKE T552A-TPR01,

VI LIKE T552A-TPR01,

SA LIKE T552A-TPR01,

DO LIKE T552A-TPR01,

END OF TURNOS.

  • TYPE TURNOS *

*----


*

*----


*

  • TYPE SOCIO *

TYPES: BEGIN OF SOCIO,

NUMERO LIKE PERNR-PERNR,

REPOSICION LIKE PA0050-ZAUVE,

NOMBRE LIKE PA0002-VORNA,

TURNOS TYPE TURNOS,

END OF SOCIO.

  • TYPE SOCIO *

*----


*

*----


*

  • ESTRUCTURA ACCESOS *

DATA: BEGIN OF ACCESOS OCCURS 0,

SOCIO TYPE SOCIO,

END OF ACCESOS.

  • ESTRUCTURA ACCESOS *

*----


*

*----


*

  • START OF SELECTION *

START-OF-SELECTION.

PERFORM LLENA_ACCESOS.

PERFORM DESCARGA_XML.

END-OF-SELECTION.

  • END OF SELECTION *

*----


*

*----


*

  • FORM LLENA_ACCESOS *

FORM LLENA_ACCESOS.

REFRESH ACCESOS.

CLEAR ACCESOS.

MOVE: '45050' TO ACCESOS-SOCIO-NUMERO,

'MOISES MORENO' TO ACCESOS-SOCIO-NOMBRE,

'0' TO ACCESOS-SOCIO-REPOSICION,

'T1' TO ACCESOS-SOCIO-TURNOS-LU,

'T2' TO ACCESOS-SOCIO-TURNOS-MA,

'T3' TO ACCESOS-SOCIO-TURNOS-MI,

'T4' TO ACCESOS-SOCIO-TURNOS-JU,

'T5' TO ACCESOS-SOCIO-TURNOS-VI,

'T6' TO ACCESOS-SOCIO-TURNOS-SA,

'T7' TO ACCESOS-SOCIO-TURNOS-DO.

APPEND ACCESOS.

CLEAR ACCESOS.

MOVE: '45051' TO ACCESOS-SOCIO-NUMERO,

'RUTH PEÑA' TO ACCESOS-SOCIO-NOMBRE,

'0' TO ACCESOS-SOCIO-REPOSICION,

'T1' TO ACCESOS-SOCIO-TURNOS-LU,

'T2' TO ACCESOS-SOCIO-TURNOS-MA,

'T3' TO ACCESOS-SOCIO-TURNOS-MI,

'T4' TO ACCESOS-SOCIO-TURNOS-JU,

'T5' TO ACCESOS-SOCIO-TURNOS-VI,

'T6' TO ACCESOS-SOCIO-TURNOS-SA,

'T7' TO ACCESOS-SOCIO-TURNOS-DO.

APPEND ACCESOS.

ENDFORM.

  • FORM LLENA_ACCESOS *

*----


*

*----


*

  • FORM DESCARGA_XML *

FORM DESCARGA_XML.

DATA: L_DOM TYPE REF TO IF_IXML_ELEMENT,

M_DOCUMENT TYPE REF TO IF_IXML_DOCUMENT,

G_IXML TYPE REF TO IF_IXML,

W_STRING TYPE XSTRING,

W_SIZE TYPE I,

W_RESULT TYPE I,

W_LINE TYPE STRING,

IT_XML TYPE DCXMLLINES,

S_XML LIKE LINE OF IT_XML,

W_RC LIKE SY-SUBRC.

DATA: XML TYPE DCXMLLINES.

DATA: RC TYPE SY-SUBRC,

BEGIN OF XML_TAB OCCURS 0,

D LIKE LINE OF XML,

END OF XML_TAB.

CLASS CL_IXML DEFINITION LOAD.

G_IXML = CL_IXML=>CREATE( ).

CHECK NOT G_IXML IS INITIAL.

M_DOCUMENT = G_IXML->CREATE_DOCUMENT( ).

CHECK NOT M_DOCUMENT IS INITIAL.

WRITE: / 'Converting DATA TO DOM 1:'.

CALL FUNCTION 'SDIXML_DATA_TO_DOM'

EXPORTING

NAME = 'ACCESOS'

DATAOBJECT = ACCESOS[]

IMPORTING

DATA_AS_DOM = L_DOM

CHANGING

DOCUMENT = M_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.

W_RC = M_DOCUMENT->APPEND_CHILD( NEW_CHILD = L_DOM ).

IF W_RC IS INITIAL.

WRITE 'Ok'.

ELSE.

WRITE: 'Err =',

W_RC.

ENDIF.

CALL FUNCTION 'SDIXML_DOM_TO_XML'

EXPORTING

DOCUMENT = M_DOCUMENT

IMPORTING

XML_AS_STRING = W_STRING

SIZE = W_SIZE

TABLES

XML_AS_TABLE = IT_XML

EXCEPTIONS

NO_DOCUMENT = 1

OTHERS = 2.

IF SY-SUBRC = 0.

WRITE 'Ok'.

ELSE.

WRITE: 'Err =',

SY-SUBRC.

ENDIF.

LOOP AT IT_XML INTO XML_TAB-D.

APPEND XML_TAB.

ENDLOOP.

CALL FUNCTION 'GUI_DOWNLOAD'

EXPORTING

BIN_FILESIZE = W_SIZE

FILENAME = GK_RUTA

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.

  • FORM DESCARGA_XML *

*----


*

Thanks & regards

Sreenivasulu P

former_member188685
Active Contributor
0 Kudos

Hi,

Check these links...

/people/r.eijpe/blog/2005/11/10/xml-dom-processing-in-abap-part-i--convert-an-abap-table-into-xml-file-using-sap-dom-approach

Regards

vijay

athavanraja
Active Contributor
0 Kudos

if you are considering transforming itab data to xml, the simplest way is to use the new ABAP key word

CALL TRANSFORMATION

but when its more complex with deep structures and attributes at element levet then you can go for CL_XML_DOCUMENT

let us know what exactly you are looking to do, we can come out with better option

Regards

Raja