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: 

Does anyone has a program which parse xml to txt file

Former Member
0 Kudos

Does anyone has a program which parse xml to txt file

1 REPLY 1

Former Member
0 Kudos

Hi Tina,

please try this:

REPORT zxml MESSAGE-ID bcciixmlt3_msg LINE-SIZE 1000.

*INCLUDE bcciixml_decl.

*INCLUDE bcciixml_impl..

TYPES:

BEGIN OF t_xml_line,

data(256) TYPE x,

END OF t_xml_line.

DATA:

BEGIN OF i_data OCCURS 0,

field TYPE string,

attr TYPE string,

value TYPE string,

END OF i_data,

i_xml TYPE TABLE OF t_xml_line.

DATA:

if_ixml TYPE REF TO if_ixml,

if_document TYPE REF TO if_ixml_document,

if_stream_factory TYPE REF TO if_ixml_stream_factory,

if_istream TYPE REF TO if_ixml_istream,

if_parser TYPE REF TO if_ixml_parser,

if_node TYPE REF TO if_ixml_node,

if_text TYPE REF TO if_ixml_text,

if_parse_error TYPE REF TO if_ixml_parse_error,

w_string TYPE string,

w_count TYPE i,

w_index TYPE i,

w_length TYPE i,

w_save TYPE string,

w_err TYPE c,

w_file TYPE string.

PARAMETERS:

p_file TYPE rlgrap-filename

DEFAULT 'c:\temp\Request_RG.xml'.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.

PERFORM select_file.

START-OF-SELECTION.

PERFORM open_file.

CHECK w_err IS INITIAL.

PERFORM read_file.

**-- render the DOM back into an output stream/internal table

  • DATA: postream TYPE REF TO if_ixml_ostream.

  • postream = pstreamfactory->create_ostream_itable( table = xml_table )

*.

  • CALL METHOD pdocument->render( ostream = postream ).

**-- how many bytes were written to the table?

  • totalsize = postream->get_num_written_raw( ).

*-- write the XML document back to the frontend

  • CONCATENATE filename '.out' INTO filename.

  • CONDENSE filename NO-GAPS.

*CALL FUNCTION 'WS_DOWNLOAD'

  • EXPORTING

  • BIN_FILESIZE = totalSize

  • FILENAME = filename

  • FILETYPE = 'BIN'

  • TABLES

  • DATA_TAB = xml_table

  • EXCEPTIONS

  • OTHERS = 11

  • .

*IF SY-SUBRC <> 0.

*ENDIF.

*-- print the whole DOM tree as a list...

if_node = if_document.

PERFORM convert_xml USING if_node.

END-OF-SELECTION.

PERFORM output_xml.

break david.

&----


*& Form select_file

&----


  • text

----


FORM select_file.

DATA:

li_file_table TYPE filetable,

lwa_file_table TYPE LINE OF filetable,

lw_return TYPE i.

  • CALL FUNCTION 'KD_GET_FILENAME_ON_F4'

  • CHANGING

  • file_name = p_file

  • EXCEPTIONS

  • mask_too_long = 1

  • OTHERS = 2.

*

  • IF sy-subrc <> 0.

  • MESSAGE i007(zu). " 'Error in getting filename'.

  • ENDIF.

  • Dialog anzeigen

CALL METHOD cl_gui_frontend_services=>file_open_dialog

EXPORTING

file_filter = '(.)'

CHANGING

file_table = li_file_table

rc = lw_return

EXCEPTIONS

file_open_dialog_failed = 1

cntl_error = 2.

IF sy-subrc EQ 0.

READ TABLE li_file_table INTO lwa_file_table INDEX 1.

MOVE lwa_file_table TO p_file.

ENDIF.

ENDFORM. " select_file

&----


*& Form open_file

&----


  • text

----


FORM open_file.

w_file = p_file.

CALL METHOD cl_gui_frontend_services=>gui_upload

EXPORTING

filename = w_file

filetype = 'BIN'

IMPORTING

filelength = w_length

CHANGING

data_tab = i_xml.

IF sy-subrc <> 0.

MESSAGE w000.

w_err = 'X'.

ENDIF.

ENDFORM. " open_file

&----


*& Form read_file

&----


  • text

----


FORM read_file.

DATA:

lw_line TYPE i,

lw_column TYPE i.

CLASS cl_ixml DEFINITION LOAD.

*-- create the main factory

if_ixml = cl_ixml=>create( ).

*-- create the initial document

if_document = if_ixml->create_document( ).

*-- create the stream factory

if_stream_factory = if_ixml->create_stream_factory( ).

*-- create an input stream for the table

if_istream =

if_stream_factory->create_istream_itable( table = i_xml

size = w_length ).

*-- create the parser

if_parser =

if_ixml->create_parser( stream_factory = if_stream_factory

istream = if_istream

document = if_document ).

*-- parse the stream

IF if_parser->parse( ) NE 0.

IF if_parser->num_errors( ) NE 0.

w_count = if_parser->num_errors( ).

WRITE: w_count, ' parse errors have occured:'.

w_index = 0.

WHILE w_index < w_count.

if_parse_error = if_parser->get_error( index = w_index ).

lw_line = if_parse_error->get_line( ).

WRITE: 'line: ', lw_line.

lw_column = if_parse_error->get_column( ).

WRITE: 'column: ', lw_column.

w_string = if_parse_error->get_reason( ).

WRITE: w_string.

ADD 1 TO w_index.

ENDWHILE.

ENDIF.

ENDIF.

*-- we don't need the stream any more, so let's close it...

CALL METHOD if_istream->close( ).

CLEAR if_istream.

ENDFORM. " read_file

&----


*& Form convert_xml

&----


  • text

----


FORM convert_xml USING value(fuif_node) TYPE REF TO if_ixml_node.

DATA:

lw_indent TYPE i,

lw_text TYPE REF TO if_ixml_text,

lw_string TYPE string,

if_nodemap TYPE REF TO if_ixml_named_node_map,

lw_count TYPE i,

lw_index TYPE i,

lw_attr TYPE REF TO if_ixml_node,

lw_name TYPE string,

lw_value TYPE string.

lw_indent = fuif_node->get_height( ) * 2.

CASE fuif_node->get_type( ).

  • Feld-Bezeichnungen

WHEN if_ixml_node=>co_node_element.

lw_string = fuif_node->get_name( ).

i_data-field = lw_string.

w_save = lw_string.

  • Attribute

if_nodemap = fuif_node->get_attributes( ).

IF NOT if_nodemap IS INITIAL.

lw_count = if_nodemap->get_length( ).

DO lw_count TIMES.

lw_index = sy-index - 1.

lw_attr = if_nodemap->get_item( lw_index ).

lw_name = lw_attr->get_name( ).

lw_value = lw_attr->get_value( ).

i_data-attr = lw_name.

i_data-value = lw_value.

APPEND i_data.

CLEAR: i_data-value, i_data-attr.

ENDDO.

ENDIF.

  • Feld-Inhalte

WHEN if_ixml_node=>co_node_text.

lw_text ?= fuif_node->query_interface( ixml_iid_text ).

IF lw_text->ws_only( ) IS INITIAL.

lw_string = fuif_node->get_value( ).

i_data-field = w_save.

i_data-value = lw_string.

ENDIF.

ENDCASE.

IF NOT i_data-value IS INITIAL.

APPEND i_data.

ENDIF.

CLEAR i_data.

fuif_node = fuif_node->get_first_child( ).

WHILE NOT fuif_node IS INITIAL.

PERFORM convert_xml USING fuif_node.

fuif_node = fuif_node->get_next( ).

ENDWHILE.

ENDFORM. " convert_xml

&----


*& Form output_xml

&----


  • text

----


FORM output_xml.

DATA:

lw_col TYPE c,

lw_field(20) TYPE c,

lw_attr(20) TYPE c,

lw_value(100) TYPE c.

LOOP AT i_data.

IF lw_col = 'X'.

FORMAT COLOR 3.

CLEAR lw_col.

ELSE.

FORMAT COLOR 4.

lw_col = 'X'.

ENDIF.

MOVE: i_data-field TO lw_field,

i_data-attr TO lw_attr,

i_data-value TO lw_value.

WRITE: /1 lw_field, 25 lw_attr, 49 lw_value.

ENDLOOP.

ENDFORM. " output_xml