2016 Aug 22 11:51 PM
Hi dear,
please i need a help of us.
I need convert XML (in string) to internal table, this code is perfect becaus de structure XML is dynamically, buuut i don 't know how i change file to XML string:
********************* CODE *************************************
CREATE OBJECT lcl_xml_doc.
*&--CONVERSION OF XML TO ITAB PROCESS--&*
CALL METHOD lcl_xml_doc->import_from_file
EXPORTING
filename = p_filnam
RECEIVING
retcode = v_subrc.
* CHECK v_subrc = 0.
v_node = lcl_xml_doc->m_document.
CHECK NOT v_node IS INITIAL.
v_iterator = v_node->create_iterator( ).
v_node = v_iterator->get_next( ).
WHILE NOT v_node IS INITIAL.
CASE v_node->get_type( ).
WHEN if_ixml_node=>co_node_element.
v_name = v_node->get_name( ).
v_nodemap = v_node->get_attributes( ).
IF NOT v_nodemap IS INITIAL.
* attributes
v_count = v_nodemap->get_length( ).
DO v_count TIMES.
v_index = sy-index - 1.
v_attr = v_nodemap->get_item( v_index ).
v_name = v_attr->get_name( ).
v_prefix = v_attr->get_namespace_prefix( ).
v_value = v_attr->get_value( ).
ENDDO.
ENDIF.
WHEN if_ixml_node=>co_node_text OR
if_ixml_node=>co_node_cdata_section.
* text node
v_value = v_node->get_value( ).
MOVE v_value TO v_char.
IF v_char <> cl_abap_char_utilities=>cr_lf.
wa-name = v_name.
wa-value = v_value.
APPEND wa TO itab.
CLEAR wa.
ENDIF.
ENDCASE.
* advance to next node
v_node = v_iterator->get_next( ).
ENDWHILE.
*&-- WRITING ITAB FILES IN OUTPUT--&*
LOOP AT itab INTO wa.
WRITE :/1 wa-name,20 wa-value.
ENDLOOP.
********************* CODE *************************************
Does anyone have any ideas?
2016 Aug 23 4:09 AM
Hi, Maby you can try it:
TYPE-POOLS: SLIS,ABAP.
include <symbol>.
DATA : lcl_xml_doc TYPE REF TO CL_XML_DOCUMENT,
v_subrc LIKE sy-subrc,
p_filnam TYPE LOCALFILE value 'H:\tmp\ACER 3C3-20130909001-20130918-084215.xml'.
DATA: v_node TYPE REF TO if_ixml_node,
v_child_node TYPE REF TO if_ixml_node,
v_root TYPE REF TO if_ixml_node,
v_iterator TYPE REF TO if_ixml_node_iterator,
v_nodemap TYPE REF TO if_ixml_named_node_map,
v_count TYPE i, v_index TYPE i,
v_attr TYPE REF TO if_ixml_node,
v_name TYPE string,
v_prefix TYPE string,
v_value TYPE string,
v_char TYPE char2,
V_PTEXT TYPE REF TO IF_IXML_TEXT,
v_node_info TYPE string,
retval TYPE REF TO IF_IXML_NODE_FILTER,
filter2 type ref to if_ixml_node_filter,
pdocument type ref to if_ixml_document.
TYPES: BEGIN OF ty_tab,
caminho type string,
name type LVC_FNAME, " TYPE string,
value TYPE string,
END OF ty_tab.
DATA: itab TYPE STANDARD TABLE OF ty_tab,
wa TYPE ty_tab.
DATA: BEGIN OF field_name OCCURS 0,
name type LVC_FNAME,
END OF field_name.
DATA: l_count TYPE I.
CREATE OBJECT lcl_xml_doc.
*&--CONVERSION OF XML TO ITAB PROCESS--&*
CALL METHOD lcl_xml_doc->import_from_file
EXPORTING
filename = p_filnam
RECEIVING
retcode = v_subrc.
* CHECK v_subrc = 0.
v_node = lcl_xml_doc->m_document.
CHECK NOT v_node IS INITIAL.
v_iterator = v_node->create_iterator( ).
v_node = v_iterator->get_next( ).
WHILE NOT v_node IS INITIAL.
CASE v_node->get_type( ).
WHEN if_ixml_node=>co_node_element.
v_name = v_node->get_name( ).
v_nodemap = v_node->get_attributes( ).
IF NOT v_nodemap IS INITIAL.
* attributes
v_count = v_nodemap->get_length( ).
DO v_count TIMES.
v_index = sy-index - 1.
v_attr = v_nodemap->get_item( v_index ).
v_name = v_attr->get_name( ).
v_prefix = v_attr->get_namespace_prefix( ).
v_value = v_attr->get_value( ).
ENDDO.
ENDIF.
WHEN if_ixml_node=>co_node_text OR
if_ixml_node=>co_node_cdata_section.
* text node
v_value = v_node->get_value( ).
MOVE v_value TO v_char.
IF v_char <> cl_abap_char_utilities=>cr_lf.
wa-name = v_name.
wa-value = v_value.
APPEND wa TO itab.
CLEAR wa.
**get field name
READ TABLE field_name WITH KEY name = v_name.
IF sy-subrc <> 0.
field_name-name = v_name.
APPEND field_name. CLEAR field_name.
l_count = l_count + 1.
ENDIF.
ENDIF.
ENDCASE.
* advance to next node
v_node = v_iterator->get_next( ).
ENDWHILE.
*&-- WRITING ITAB FILES IN OUTPUT--&*
* LOOP AT itab INTO wa.
* WRITE :/1 wa-name,20 wa-value.
* ENDLOOP.
**convert to inintal table
DATA: dy_table TYPE REF TO data,
dy_line TYPE REF TO data,
it_structure TYPE lvc_t_fcat,
wa_structure TYPE lvc_s_fcat.
FIELD-SYMBOLS:<dyn_table> TYPE STANDARD TABLE,
<dyn_wa> TYPE ANY,
<dyn_field> TYPE ANY.
DATA:wa_new_line TYPE REF TO data.
DATA:l_pos TYPE i VALUE '1'.
DATA: w_loop LIKE sy-tabix.
DATA: l_mod TYPE I.
LOOP AT field_name.
l_pos = l_pos + 1.
wa_structure-fieldname = field_name-name.
wa_structure-col_pos = 1.
APPEND wa_structure TO it_structure.
ENDLOOP.
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = it_structure
IMPORTING
ep_table = dy_table.
ASSIGN dy_table->* TO <dyn_table>.
CREATE DATA wa_new_line LIKE LINE OF <dyn_table>.
ASSIGN wa_new_line->* TO <dyn_wa>.
LOOP AT itab INTO wa.
w_loop = sy-tabix.
LOOP AT it_structure INTO wa_structure.
IF wa_structure-fieldname = wa-name.
ASSIGN COMPONENT wa_structure-fieldname OF STRUCTURE <dyn_wa> TO <dyn_field>.
<dyn_field> = wa-value.
ENDIF.
ENDLOOP.
l_mod = w_loop MOD l_count.
IF l_mod = 0.
APPEND <dyn_wa> TO <dyn_table>.
CLEAR <dyn_wa>.
ENDIF.
ENDLOOP.
XML Like this:
Result as follow:
2016 Aug 23 4:09 AM
Hi, Maby you can try it:
TYPE-POOLS: SLIS,ABAP.
include <symbol>.
DATA : lcl_xml_doc TYPE REF TO CL_XML_DOCUMENT,
v_subrc LIKE sy-subrc,
p_filnam TYPE LOCALFILE value 'H:\tmp\ACER 3C3-20130909001-20130918-084215.xml'.
DATA: v_node TYPE REF TO if_ixml_node,
v_child_node TYPE REF TO if_ixml_node,
v_root TYPE REF TO if_ixml_node,
v_iterator TYPE REF TO if_ixml_node_iterator,
v_nodemap TYPE REF TO if_ixml_named_node_map,
v_count TYPE i, v_index TYPE i,
v_attr TYPE REF TO if_ixml_node,
v_name TYPE string,
v_prefix TYPE string,
v_value TYPE string,
v_char TYPE char2,
V_PTEXT TYPE REF TO IF_IXML_TEXT,
v_node_info TYPE string,
retval TYPE REF TO IF_IXML_NODE_FILTER,
filter2 type ref to if_ixml_node_filter,
pdocument type ref to if_ixml_document.
TYPES: BEGIN OF ty_tab,
caminho type string,
name type LVC_FNAME, " TYPE string,
value TYPE string,
END OF ty_tab.
DATA: itab TYPE STANDARD TABLE OF ty_tab,
wa TYPE ty_tab.
DATA: BEGIN OF field_name OCCURS 0,
name type LVC_FNAME,
END OF field_name.
DATA: l_count TYPE I.
CREATE OBJECT lcl_xml_doc.
*&--CONVERSION OF XML TO ITAB PROCESS--&*
CALL METHOD lcl_xml_doc->import_from_file
EXPORTING
filename = p_filnam
RECEIVING
retcode = v_subrc.
* CHECK v_subrc = 0.
v_node = lcl_xml_doc->m_document.
CHECK NOT v_node IS INITIAL.
v_iterator = v_node->create_iterator( ).
v_node = v_iterator->get_next( ).
WHILE NOT v_node IS INITIAL.
CASE v_node->get_type( ).
WHEN if_ixml_node=>co_node_element.
v_name = v_node->get_name( ).
v_nodemap = v_node->get_attributes( ).
IF NOT v_nodemap IS INITIAL.
* attributes
v_count = v_nodemap->get_length( ).
DO v_count TIMES.
v_index = sy-index - 1.
v_attr = v_nodemap->get_item( v_index ).
v_name = v_attr->get_name( ).
v_prefix = v_attr->get_namespace_prefix( ).
v_value = v_attr->get_value( ).
ENDDO.
ENDIF.
WHEN if_ixml_node=>co_node_text OR
if_ixml_node=>co_node_cdata_section.
* text node
v_value = v_node->get_value( ).
MOVE v_value TO v_char.
IF v_char <> cl_abap_char_utilities=>cr_lf.
wa-name = v_name.
wa-value = v_value.
APPEND wa TO itab.
CLEAR wa.
**get field name
READ TABLE field_name WITH KEY name = v_name.
IF sy-subrc <> 0.
field_name-name = v_name.
APPEND field_name. CLEAR field_name.
l_count = l_count + 1.
ENDIF.
ENDIF.
ENDCASE.
* advance to next node
v_node = v_iterator->get_next( ).
ENDWHILE.
*&-- WRITING ITAB FILES IN OUTPUT--&*
* LOOP AT itab INTO wa.
* WRITE :/1 wa-name,20 wa-value.
* ENDLOOP.
**convert to inintal table
DATA: dy_table TYPE REF TO data,
dy_line TYPE REF TO data,
it_structure TYPE lvc_t_fcat,
wa_structure TYPE lvc_s_fcat.
FIELD-SYMBOLS:<dyn_table> TYPE STANDARD TABLE,
<dyn_wa> TYPE ANY,
<dyn_field> TYPE ANY.
DATA:wa_new_line TYPE REF TO data.
DATA:l_pos TYPE i VALUE '1'.
DATA: w_loop LIKE sy-tabix.
DATA: l_mod TYPE I.
LOOP AT field_name.
l_pos = l_pos + 1.
wa_structure-fieldname = field_name-name.
wa_structure-col_pos = 1.
APPEND wa_structure TO it_structure.
ENDLOOP.
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = it_structure
IMPORTING
ep_table = dy_table.
ASSIGN dy_table->* TO <dyn_table>.
CREATE DATA wa_new_line LIKE LINE OF <dyn_table>.
ASSIGN wa_new_line->* TO <dyn_wa>.
LOOP AT itab INTO wa.
w_loop = sy-tabix.
LOOP AT it_structure INTO wa_structure.
IF wa_structure-fieldname = wa-name.
ASSIGN COMPONENT wa_structure-fieldname OF STRUCTURE <dyn_wa> TO <dyn_field>.
<dyn_field> = wa-value.
ENDIF.
ENDLOOP.
l_mod = w_loop MOD l_count.
IF l_mod = 0.
APPEND <dyn_wa> TO <dyn_table>.
CLEAR <dyn_wa>.
ENDIF.
ENDLOOP.
XML Like this:
Result as follow:
2016 Aug 23 7:13 PM
Hi Spring Long ,
Thanks for your help....i change the code but partly it worked, I realized that in the string reading the next node is losing part of XML in your code you had this problem?
2016 Aug 24 1:22 AM
Hello Wilson Matsuoka: Can you posted your XML file screenshot ? Maybe i can adjust the code so that solve your problem.
2016 Aug 24 12:48 PM
Hi Spring,
my xml dynamically, but in this case is:
<?xml version="1.0" encoding="utf-8"?>#<eSocial xmlns:es="http://www.esocial.gov.br/schema/evt">
<evtMonit>
<Id>ID1103944220001422016081619062200002</Id>
<ideEvento>
<indRetif>1</indRetif>
<nrRecibo />
<tpAmb>3</tpAmb>
<procEmi>1</procEmi>
<verProc>7.0</verProc>
</ideEvento>
<ideEmpregador>
<tpInscricao>1</tpInscricao>
<nrInscr>10394422000142</nrInscr>
</ideEmpregador>
<ideVinculo>
<cpfTrab>010.509.196-02</cpfTrab>
<nisTrab>2222222222</nisTrab>
<matricula>37100974</matricula>
</ideVinculo>
<aso>#
<dtAso>2015-09-03</dtAso>
<tpAso>1</tpAso>
<resAso>1</resAso>
<exame />
<monitBiolog>#
<respMonit>
<nrConsClasse>119151</nrConsClasse>
<ufConsClasse>SP</ufConsClasse>
</respMonit>
</monitBiolog>
<ideServSaude>
<frmCtt>AV XXXXX, 333 XXXX - XXXXXX - SP Cep:33333 222 22222222</frmCtt>
<medico>
<nmMed>ROBERTO NETO</nmMed>
<crm>
<nrCRM>119151</nrCRM>
<ufCRM>SP</ufCRM>
</crm>
</medico>
</ideServSaude>
</aso>
</evtMonit>#</eSocial>#<eSocial xmlns:es="http://www.esocial.gov.br/schema/evt">
<evtMonit>
<Id>ID1103944220001422016081619062100001</Id>
<ideEvento>
<indRetif>1</indRetif>
<nrRecibo />
<tpAmb>3</tpAmb>
<procEmi>1</procEmi>
<verProc>7.0</verProc>
</ideEvento>
<ideEmpregador>
<tpInscricao>1</tpInscricao>#
</monitBiolog>
<ideServSaude>
<frmCtt>XXXXX, 777XXX - XXXX - SP Cep: 1111111 19 22222 </frmCtt>
<medico>
<nmMed>Eleonor aberto</nmMed>
<crm>
<nrCRM>111111</n
</medico>
</ideServSaude>
</aso>
Just remember, this code is load in string ( <![CDATA[<?xml ......)
thanks a lot
2016 Aug 25 2:03 AM
Hello Wilson: It seem that your xml file structure field is single (My test xml field is duplicate). Please try modify code like this:
1. code:
* text node
v_value = v_node->get_value( ).
MOVE v_value TO v_char.
IF v_char <> cl_abap_char_utilities=>cr_lf.
TRANSLATE v_name TO UPPER CASE. "add new line code
wa-name = v_name.
wa-value = v_value.
APPEND wa TO itab.
CLEAR wa.
**get field name
READ TABLE field_name WITH KEY name = v_name.
IF sy-subrc <> 0.
field_name-name = v_name.
APPEND field_name. CLEAR field_name.
* l_count = l_count + 1. "mark the line
ENDIF.
ENDIF.
2. code:
* l_mod = w_loop MOD l_count. "delete the line
* IF l_mod = 0. "delete the line
AT LAST. "add new line
APPEND <dyn_wa> TO <dyn_table>.
CLEAR <dyn_wa>.
ENDAT. "add new line
* ENDIF. "delete the line
2016 Aug 26 7:22 PM
2016 Aug 23 5:01 AM
There are no. of threads raised on this topic. i found below tutorial is very useful and productive.
Reference Link: Tutorial: Data exchange between ABAP and XML
Hope this helps.
2016 Aug 24 7:20 AM
Personally, I would use the sXML library for such a task, because in my opinion it is simpler to use compared to iXML. See a parsing example, maybe you can adjust it to your needs.
Another "simple" way can be to write a Simple Transformation that fits your XML data using the tt:loop statement that directly deserializes into an internal table.
Horst