11-08-2007 9:10 AM
11-08-2007 9:54 AM
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