‎2020 Mar 13 10:42 AM
Hi all,
I would like to extract a set of nodes from my XML source to new XML destination. For example, i have the following XML string :
<myDoc>
<enc>
<jav>12</jav>
<rec>12</rec>
</enc>
</myDoc>
And i would like to have the following XML string:
<enc>
<jav>12</jav>
<rec>12</rec>
</enc><br>
Any help will be greatly appreciated 🙂
Regards,
Laurent G.
‎2020 Mar 13 1:39 PM
You could use if_ixml_node->clone. Are you aware of all the XML-interfaces and do you know how to use them? (lookup in SE24 'cl_ixml*' and 'if_ixml*').
Coding:
* interface
DATA: iv_xml TYPE string,
ev_xml TYPE string.
* xml data
DATA: lr_xml TYPE REF TO if_ixml,
lr_new_xml TYPE REF TO if_ixml,
lr_document TYPE REF TO if_ixml_document,
lr_new_document TYPE REF TO if_ixml_document,
lr_streamfactory TYPE REF TO if_ixml_stream_factory,
lr_new_streamfactory TYPE REF TO if_ixml_stream_factory,
lr_istream TYPE REF TO if_ixml_istream,
lr_ostream TYPE REF TO if_ixml_ostream,
lr_renderer TYPE REF TO if_ixml_renderer,
lr_parser TYPE REF TO if_ixml_parser,
lr_nodes TYPE REF TO if_ixml_node_collection,
lr_node TYPE REF TO if_ixml_node,
lr_new_node TYPE REF TO if_ixml_node.
DATA lv_index TYPE i.
DATA lv_rval TYPE i.
* create xml main factory
CALL METHOD cl_ixml=>create
RECEIVING
rval = lr_xml.
* create xml document
CALL METHOD lr_xml->create_document
RECEIVING
rval = lr_document.
* create xml stream factory
CALL METHOD lr_xml->create_stream_factory
RECEIVING
rval = lr_streamfactory.
* create xml input stream
" iv_xml = '<myDoc><enc><jav>12</jav><rec>12</rec></enc></myDoc>'.
CALL METHOD lr_streamfactory->create_istream_string
EXPORTING
string = iv_xml " your xml document as string
RECEIVING
rval = lr_istream.
* create xml parser
CALL METHOD lr_xml->create_parser
EXPORTING
document = lr_document
istream = lr_istream
stream_factory = lr_streamfactory
RECEIVING
rval = lr_parser.
* parse input stream into document
CALL METHOD lr_parser->parse.
**************************************************************
* read nodes <enc>
CALL METHOD lr_document->get_elements_by_tag_name
EXPORTING
name = 'enc'
RECEIVING
rval = lr_nodes.
* read node <enc>
CALL METHOD lr_nodes->get_item
EXPORTING
index = lv_index
RECEIVING
rval = lr_node.
IF lr_node IS NOT INITIAL.
" create new xml
CALL METHOD cl_ixml=>create
RECEIVING
rval = lr_new_xml.
" create new xml document
CALL METHOD lr_new_xml->create_document
RECEIVING
rval = lr_new_document.
" clone current node
lr_new_node = lr_node->clone( ).
" append new node as child to new document
lv_rval = lr_new_document->append_child( lr_new_node ).
* create new xml stream factory
CALL METHOD lr_new_xml->create_stream_factory
RECEIVING
rval = lr_new_streamfactory.
* create new xml output stream as character string
CALL METHOD lr_new_streamfactory->create_ostream_cstring
EXPORTING
string = ev_xml
RECEIVING
rval = lr_ostream.
* create xml renderer
CALL METHOD lr_new_xml->create_renderer
EXPORTING
document = lr_new_document
ostream = lr_ostream
RECEIVING
rval = lr_renderer.
* render document into output stream
CALL METHOD lr_renderer->render.
ENDIF.
‎2020 Mar 13 1:39 PM
You could use if_ixml_node->clone. Are you aware of all the XML-interfaces and do you know how to use them? (lookup in SE24 'cl_ixml*' and 'if_ixml*').
Coding:
* interface
DATA: iv_xml TYPE string,
ev_xml TYPE string.
* xml data
DATA: lr_xml TYPE REF TO if_ixml,
lr_new_xml TYPE REF TO if_ixml,
lr_document TYPE REF TO if_ixml_document,
lr_new_document TYPE REF TO if_ixml_document,
lr_streamfactory TYPE REF TO if_ixml_stream_factory,
lr_new_streamfactory TYPE REF TO if_ixml_stream_factory,
lr_istream TYPE REF TO if_ixml_istream,
lr_ostream TYPE REF TO if_ixml_ostream,
lr_renderer TYPE REF TO if_ixml_renderer,
lr_parser TYPE REF TO if_ixml_parser,
lr_nodes TYPE REF TO if_ixml_node_collection,
lr_node TYPE REF TO if_ixml_node,
lr_new_node TYPE REF TO if_ixml_node.
DATA lv_index TYPE i.
DATA lv_rval TYPE i.
* create xml main factory
CALL METHOD cl_ixml=>create
RECEIVING
rval = lr_xml.
* create xml document
CALL METHOD lr_xml->create_document
RECEIVING
rval = lr_document.
* create xml stream factory
CALL METHOD lr_xml->create_stream_factory
RECEIVING
rval = lr_streamfactory.
* create xml input stream
" iv_xml = '<myDoc><enc><jav>12</jav><rec>12</rec></enc></myDoc>'.
CALL METHOD lr_streamfactory->create_istream_string
EXPORTING
string = iv_xml " your xml document as string
RECEIVING
rval = lr_istream.
* create xml parser
CALL METHOD lr_xml->create_parser
EXPORTING
document = lr_document
istream = lr_istream
stream_factory = lr_streamfactory
RECEIVING
rval = lr_parser.
* parse input stream into document
CALL METHOD lr_parser->parse.
**************************************************************
* read nodes <enc>
CALL METHOD lr_document->get_elements_by_tag_name
EXPORTING
name = 'enc'
RECEIVING
rval = lr_nodes.
* read node <enc>
CALL METHOD lr_nodes->get_item
EXPORTING
index = lv_index
RECEIVING
rval = lr_node.
IF lr_node IS NOT INITIAL.
" create new xml
CALL METHOD cl_ixml=>create
RECEIVING
rval = lr_new_xml.
" create new xml document
CALL METHOD lr_new_xml->create_document
RECEIVING
rval = lr_new_document.
" clone current node
lr_new_node = lr_node->clone( ).
" append new node as child to new document
lv_rval = lr_new_document->append_child( lr_new_node ).
* create new xml stream factory
CALL METHOD lr_new_xml->create_stream_factory
RECEIVING
rval = lr_new_streamfactory.
* create new xml output stream as character string
CALL METHOD lr_new_streamfactory->create_ostream_cstring
EXPORTING
string = ev_xml
RECEIVING
rval = lr_ostream.
* create xml renderer
CALL METHOD lr_new_xml->create_renderer
EXPORTING
document = lr_new_document
ostream = lr_ostream
RECEIVING
rval = lr_renderer.
* render document into output stream
CALL METHOD lr_renderer->render.
ENDIF.
‎2020 Mar 13 2:17 PM
Hello Michael,
i know cl_ixml* class but i don't master them like you 🙂
clone method... of course... Now that I read your code it's clear and logical 🙂
Thanks a lot for that!!!
‎2020 Mar 16 10:31 AM
cailleteric95, glad I could be of help. Let me know if it works for you or if you have further questions.
As a side note: please use "comment function" for 'comments', not 'answers'. The 'answer' of yours should have been a 'comment' to the 'answer' above.