Application Development and Automation 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: 
Read only

from internal table to customtable

Former Member
0 Likes
448

Hi guyz,

i've read the data from the xml into internal table...now , how can i pass the data from the internal table to custom table into respective fields.

*************************************************

Program

*************************************************

REPORT zmlintosap .

CLASS cl_ixml DEFINITION LOAD.

TYPE-POOLS: ixml.

TYPES: BEGIN OF t_xml_line,

data(256) TYPE x,

END OF t_xml_line,

BEGIN OF tsfixml,

data(1024) TYPE c,

END OF tsfixml.

DATA: l_ixml TYPE REF TO if_ixml,

l_streamfactory TYPE REF TO if_ixml_stream_factory,

l_parser TYPE REF TO if_ixml_parser,

l_istream TYPE REF TO if_ixml_istream,

l_document TYPE REF TO if_ixml_document,

l_node TYPE REF TO if_ixml_node,

l_xmldata TYPE string.

DATA: l_elem TYPE REF TO if_ixml_element,

l_root_node TYPE REF TO if_ixml_node,

l_next_node TYPE REF TO if_ixml_node,

l_name TYPE string,

l_iterator TYPE REF TO if_ixml_node_iterator.

DATA: l_xml_table TYPE TABLE OF t_xml_line,

l_xml_line TYPE t_xml_line,

l_xml_table_size TYPE i.

DATA: l_filename TYPE string.

PARAMETERS: pa_file TYPE char1024 DEFAULT

'C:\indigolighthouse20080107092755183578amz.xml'.

*Validation of XML file: Only DTD included in xml document is

*supported

PARAMETERS: pa_val TYPE char1 AS CHECKBOX.

START-OF-SELECTION.

*Creating the main iXML factory

l_ixml = cl_ixml=>create( ).

*Creating a stream factory

l_streamfactory = l_ixml->create_stream_factory( ).

PERFORM get_xml_table CHANGING l_xml_table_size l_xml_table.

*wrap the table containing the file into a stream

l_istream = l_streamfactory->create_istream_itable( table =

l_xml_table

size =

l_xml_table_size ).

*Creating a document

l_document = l_ixml->create_document( ).

*Create a Parser

l_parser = l_ixml->create_parser( stream_factory = l_streamfactory

istream = l_istream

document = l_document ).

*Validate a document

*if pa_val eq 'X'.

*l_parser->set_validating ( mode = if_ixml_parser=>co_validate ).

*endif.

*Parse the stream

IF l_parser->parse( ) NE 0.

IF l_parser->num_errors( ) NE 0.

DATA: parseerror TYPE REF TO if_ixml_parse_error,

str TYPE string,

i TYPE i,

count TYPE i,

index TYPE i.

count = l_parser->num_errors( ).

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

index = 0.

WHILE index < count.

parseerror = l_parser->get_error( index = index ).

i = parseerror->get_line( ).

WRITE: 'line: ', i.

i = parseerror->get_column( ).

WRITE: 'column: ', i.

str = parseerror->get_reason( ).

WRITE: str.

index = index + 1.

ENDWHILE.

ENDIF.

ENDIF.

*Process the document

IF l_parser->is_dom_generating( ) EQ 'X'.

PERFORM process_dom USING l_document.

ENDIF.

*&----


*& Form get_xml_table

*&----


FORM get_xml_table CHANGING l_xml_table_size TYPE i

l_xml_table TYPE standard table.

*Local variable declaration

DATA: l_len TYPE i,

l_len2 TYPE i,

l_tab TYPE tsfixml,

l_content TYPE string,

l_str1 TYPE string,

*c_conv TYPE REF TO cl_abap_conv_in_ce,

l_itab TYPE TABLE OF string.

l_filename = pa_file.

*upload a file from the client's workstation

CALL METHOD cl_gui_frontend_services=>gui_upload

EXPORTING

filename = l_filename

filetype = 'BIN'

IMPORTING

filelength = l_xml_table_size

CHANGING

data_tab = l_xml_table

EXCEPTIONS

OTHERS = 19.

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. "get_xml_table

*

**&----


**& Form process_dom

**&----


FORM process_dom USING document TYPE REF TO if_ixml_document.

DATA: node TYPE REF TO if_ixml_node,

iterator TYPE REF TO if_ixml_node_iterator,

nodemap TYPE REF TO if_ixml_named_node_map,

attr TYPE REF TO if_ixml_node,

name TYPE string,

prefix TYPE string,

value TYPE string,

indent TYPE i,

count TYPE i,

index TYPE i.

DATA: name2 TYPE string,

name_root TYPE string,

node_parent TYPE REF TO if_ixml_node,

node_root TYPE REF TO if_ixml_node,

num_children TYPE i.

node ?= document.

CHECK NOT node IS INITIAL.

ULINE.

WRITE: /.

WRITE: /' DOM-TREE'.

WRITE: /.

IF node IS INITIAL.

EXIT.

ENDIF.

*create a node iterator

iterator = node->create_iterator( ).

*get current node

node = iterator->get_next( ).

*loop over all nodes

WHILE NOT node IS INITIAL.

indent = node->get_height( ) * 2.

indent = indent + 10.

num_children = node->num_children( ).

CASE node->get_type( ).

WHEN if_ixml_node=>co_node_element.

*element node

name = node->get_name( ).

WRITE:/ 'name:',name COLOR 3.

nodemap = node->get_attributes( ).

node_root = node->get_root( ).

name_root = node_root->get_name( ).

WRITE: / 'ELEMENT :'.

WRITE: AT indent name COLOR 2. "COL_POSITIVE INVERSE.

WRITE: 'NUM_CHILDREN:', num_children.

WRITE: 'ROOT:', name_root.

node_parent = node->get_parent( ).

name2 = node_parent->get_name( ).

WRITE: 'NAME2: ' , name2 COLOR 1.

IF NOT nodemap IS INITIAL.

*attributes

count = nodemap->get_length( ).

DO count TIMES.

index = sy-index - 1.

attr = nodemap->get_item( index ).

name = attr->get_name( ).

*prefix = attr->get_namespace_prefix( ).

value = attr->get_value( ).

WRITE: / 'ATTRIBUTE:'.

WRITE: AT indent name COLOR COL_HEADING INVERSE, '=',

value COLOR 7. "COL_TOTAL INVERSE.

ENDDO.

ENDIF.

WHEN if_ixml_node=>co_node_text OR

if_ixml_node=>co_node_cdata_section.

*text node

value = node->get_value( ).

WRITE: / 'VALUE :' COLOR 6.

node_parent = node->get_parent( ).

WRITE: AT indent value COLOR 6." COL_GROUP INVERSE.

name2 = node_parent->get_name( ).

WRITE: 'NAME2: ' , name2 COLOR 3.

ENDCASE.

*advance to next node

node = iterator->get_next( ).

ENDWHILE.

ENDFORM. "process_dom

Many Thanks

1 ACCEPTED SOLUTION
Read only

Former Member
0 Likes
426

If the table is empty, then use

INSERT ZTABLE FROM TABLE ITAB

if u have some data in table , then use

MODIFY ZTABLE FROM TABLE ITAB

Hi guyz,

i've read the data from the xml into internal table...now , how can i pass the data from the internal table to custom table into respective fields.

*************************************************

Program

*************************************************

REPORT zmlintosap .

CLASS cl_ixml DEFINITION LOAD.

TYPE-POOLS: ixml.

TYPES: BEGIN OF t_xml_line,

data(256) TYPE x,

END OF t_xml_line,

BEGIN OF tsfixml,

data(1024) TYPE c,

END OF tsfixml.

DATA: l_ixml TYPE REF TO if_ixml,

l_streamfactory TYPE REF TO if_ixml_stream_factory,

l_parser TYPE REF TO if_ixml_parser,

l_istream TYPE REF TO if_ixml_istream,

l_document TYPE REF TO if_ixml_document,

l_node TYPE REF TO if_ixml_node,

l_xmldata TYPE string.

DATA: l_elem TYPE REF TO if_ixml_element,

l_root_node TYPE REF TO if_ixml_node,

l_next_node TYPE REF TO if_ixml_node,

l_name TYPE string,

l_iterator TYPE REF TO if_ixml_node_iterator.

DATA: l_xml_table TYPE TABLE OF t_xml_line,

l_xml_line TYPE t_xml_line,

l_xml_table_size TYPE i.

DATA: l_filename TYPE string.

PARAMETERS: pa_file TYPE char1024 DEFAULT

'C:\indigolighthouse20080107092755183578amz.xml'.

*Validation of XML file: Only DTD included in xml document is

*supported

PARAMETERS: pa_val TYPE char1 AS CHECKBOX.

START-OF-SELECTION.

*Creating the main iXML factory

l_ixml = cl_ixml=>create( ).

*Creating a stream factory

l_streamfactory = l_ixml->create_stream_factory( ).

PERFORM get_xml_table CHANGING l_xml_table_size l_xml_table.

*wrap the table containing the file into a stream

l_istream = l_streamfactory->create_istream_itable( table =

l_xml_table

size =

l_xml_table_size ).

*Creating a document

l_document = l_ixml->create_document( ).

*Create a Parser

l_parser = l_ixml->create_parser( stream_factory = l_streamfactory

istream = l_istream

document = l_document ).

*Validate a document

*if pa_val eq 'X'.

*l_parser->set_validating ( mode = if_ixml_parser=>co_validate ).

*endif.

*Parse the stream

IF l_parser->parse( ) NE 0.

IF l_parser->num_errors( ) NE 0.

DATA: parseerror TYPE REF TO if_ixml_parse_error,

str TYPE string,

i TYPE i,

count TYPE i,

index TYPE i.

count = l_parser->num_errors( ).

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

index = 0.

WHILE index < count.

parseerror = l_parser->get_error( index = index ).

i = parseerror->get_line( ).

WRITE: 'line: ', i.

i = parseerror->get_column( ).

WRITE: 'column: ', i.

str = parseerror->get_reason( ).

WRITE: str.

index = index + 1.

ENDWHILE.

ENDIF.

ENDIF.

*Process the document

IF l_parser->is_dom_generating( ) EQ 'X'.

PERFORM process_dom USING l_document.

ENDIF.

*&----


*& Form get_xml_table

*&----


FORM get_xml_table CHANGING l_xml_table_size TYPE i

l_xml_table TYPE standard table.

*Local variable declaration

DATA: l_len TYPE i,

l_len2 TYPE i,

l_tab TYPE tsfixml,

l_content TYPE string,

l_str1 TYPE string,

*c_conv TYPE REF TO cl_abap_conv_in_ce,

l_itab TYPE TABLE OF string.

l_filename = pa_file.

*upload a file from the client's workstation

CALL METHOD cl_gui_frontend_services=>gui_upload

EXPORTING

filename = l_filename

filetype = 'BIN'

IMPORTING

filelength = l_xml_table_size

CHANGING

data_tab = l_xml_table

EXCEPTIONS

OTHERS = 19.

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. "get_xml_table

*

**&----


**& Form process_dom

**&----


FORM process_dom USING document TYPE REF TO if_ixml_document.

DATA: node TYPE REF TO if_ixml_node,

iterator TYPE REF TO if_ixml_node_iterator,

nodemap TYPE REF TO if_ixml_named_node_map,

attr TYPE REF TO if_ixml_node,

name TYPE string,

prefix TYPE string,

value TYPE string,

indent TYPE i,

count TYPE i,

index TYPE i.

DATA: name2 TYPE string,

name_root TYPE string,

node_parent TYPE REF TO if_ixml_node,

node_root TYPE REF TO if_ixml_node,

num_children TYPE i.

node ?= document.

CHECK NOT node IS INITIAL.

ULINE.

WRITE: /.

WRITE: /' DOM-TREE'.

WRITE: /.

IF node IS INITIAL.

EXIT.

ENDIF.

*create a node iterator

iterator = node->create_iterator( ).

*get current node

node = iterator->get_next( ).

*loop over all nodes

WHILE NOT node IS INITIAL.

indent = node->get_height( ) * 2.

indent = indent + 10.

num_children = node->num_children( ).

CASE node->get_type( ).

WHEN if_ixml_node=>co_node_element.

*element node

name = node->get_name( ).

WRITE:/ 'name:',name COLOR 3.

nodemap = node->get_attributes( ).

node_root = node->get_root( ).

name_root = node_root->get_name( ).

WRITE: / 'ELEMENT :'.

WRITE: AT indent name COLOR 2. "COL_POSITIVE INVERSE.

WRITE: 'NUM_CHILDREN:', num_children.

WRITE: 'ROOT:', name_root.

node_parent = node->get_parent( ).

name2 = node_parent->get_name( ).

WRITE: 'NAME2: ' , name2 COLOR 1.

IF NOT nodemap IS INITIAL.

*attributes

count = nodemap->get_length( ).

DO count TIMES.

index = sy-index - 1.

attr = nodemap->get_item( index ).

name = attr->get_name( ).

*prefix = attr->get_namespace_prefix( ).

value = attr->get_value( ).

WRITE: / 'ATTRIBUTE:'.

WRITE: AT indent name COLOR COL_HEADING INVERSE, '=',

value COLOR 7. "COL_TOTAL INVERSE.

ENDDO.

ENDIF.

WHEN if_ixml_node=>co_node_text OR

if_ixml_node=>co_node_cdata_section.

*text node

value = node->get_value( ).

WRITE: / 'VALUE :' COLOR 6.

node_parent = node->get_parent( ).

WRITE: AT indent value COLOR 6." COL_GROUP INVERSE.

name2 = node_parent->get_name( ).

WRITE: 'NAME2: ' , name2 COLOR 3.

ENDCASE.

*advance to next node

node = iterator->get_next( ).

ENDWHILE.

ENDFORM. "process_dom

Many Thanks

2 REPLIES 2
Read only

Former Member
0 Likes
427

If the table is empty, then use

INSERT ZTABLE FROM TABLE ITAB

if u have some data in table , then use

MODIFY ZTABLE FROM TABLE ITAB

Read only

0 Likes
426

HI Vasu,

Thanks For ya reply..but all i wanna know is do i have to make any changes in the code above....

Regards