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

XML extract

0 Likes
2,013

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.

1 ACCEPTED SOLUTION
Read only

michael_piesche
Active Contributor
1,784

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.

3 REPLIES 3
Read only

michael_piesche
Active Contributor
1,785

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.

Read only

0 Likes
1,784

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!!!

Read only

0 Likes
1,784

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.