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.