Variante 1 (IF_IXML_ELEMENT, IF_IXML_NODE_COLLECTION)
* XML-Daten
DATA(lv_xml) = |<object>| &&
| <str name="text">abcd</str>| &&
| <bool name="flag">true</bool>| &&
| <member name="number"><num>111</num></member>| &&
| <member name="content"><null /></member>| &&
| <member name="attr"></member>| &&
|</object>|.
* XML-Interface
DATA(o_ixml) = cl_ixml=>create( ).
* XML-Doc
DATA(o_doc) = o_ixml->create_document( ).
* Stream-Factory
DATA(o_sf) = o_ixml->create_stream_factory( ).
* Stream
DATA(o_stream) = o_sf->create_istream_string( string = lv_xml ).
* Parser-Objekt erzeugen
DATA(o_parser) = o_ixml->create_parser( document = o_doc
istream = o_stream
stream_factory = o_sf ).
* XML parsen
IF o_parser->parse( ) = 0.
* Root-Node
DATA(o_root) = o_doc->get_root_element( ).
* Alle Nodes mit Namen 'member'
DATA(o_nodes_member) = o_root->get_elements_by_tag_name( name = 'member' ).
* Iterator für die gefundenen Nodes
DATA(o_node_iterator_members) = o_nodes_member->create_iterator( ).
* ersten Iterator-Wert holen
DATA(o_nodes_temp) = o_node_iterator_members->get_next( ).
* Iterator durchgehen
WHILE NOT o_nodes_temp IS INITIAL.
* Wert der Node ausgeben
WRITE: / o_nodes_temp->get_value( ).
* Attribute
DATA(o_note_temp_attr) = o_nodes_temp->get_attributes( ).
DATA(o_node_temp_item) = o_note_temp_attr->get_named_item( 'name' ).
IF o_node_temp_item IS BOUND.
WRITE: / o_node_temp_item->get_value( ).
ENDIF.
* Children
DATA(o_node_temp_children) = o_nodes_temp->get_children( ).
WRITE: / 'Childrens:', o_node_temp_children->get_length( ).
* nächster Iterator-Wert
o_nodes_temp = o_node_iterator_members->get_next( ).
ENDWHILE.
ELSE.
* Fehlerauswertung
DO o_parser->num_errors( ) TIMES.
DATA(o_err) = o_parser->get_error( index = sy-index - 1 ).
IF o_err IS BOUND.
WRITE: / o_err->get_column( ), o_err->get_line( ), o_err->get_reason( ).
ENDIF.
ENDDO.
ENDIF.
Variante 2 (find_from_name)
* XML-Daten
DATA(lv_xml) = |<object>| &&
| <str name="text">abcd</str>| &&
| <bool name="flag">true</bool>| &&
| <member name="number"><num>111</num></member>| &&
| <member name="content"><null /></member>| &&
| <member name="attr"></member>| &&
|</object>|.
* XML-Interface
DATA(o_ixml) = cl_ixml=>create( ).
* XML-Doc
DATA(o_doc) = o_ixml->create_document( ).
* Stream-Factory
DATA(o_sf) = o_ixml->create_stream_factory( ).
* Stream
DATA(o_stream) = o_sf->create_istream_string( string = lv_xml ).
* Parser-Objekt erzeugen
DATA(o_parser) = o_ixml->create_parser( document = o_doc
istream = o_stream
stream_factory = o_sf ).
* XML parsen
IF o_parser->parse( ) = 0.
* <object>
DATA(o_root) = o_doc->find_from_name( 'object' ).
IF o_root IS BOUND.
* <str ...>
DATA(o_str) = o_root->get_first_child( ).
IF o_str IS BOUND.
* Wert der Node ausgeben
WRITE: / o_str->get_value( ).
* Attribut 'name'
DATA(o_attr) = o_str->get_attributes( ).
DATA(o_name) = o_attr->get_named_item( 'name' ).
IF o_name IS BOUND.
WRITE: / o_name->get_value( ).
ENDIF.
ENDIF.
ENDIF.
ELSE.
* Fehlerauswertung
DO o_parser->num_errors( ) TIMES.
DATA(o_err) = o_parser->get_error( index = sy-index - 1 ).
IF o_err IS BOUND.
WRITE: / o_err->get_column( ), o_err->get_line( ), o_err->get_reason( ).
ENDIF.
ENDDO.
ENDIF.