Hallo,a-dead-trousers hat geschrieben:hi!
Seltsam... Des Ergebnis einer XPath-Anfrage müsste doch IF_IXML_NODE_LIST oder IF_IXML_NODE_COLLECTION zurückliefern.
Wie du ja richtig bemerkt hast, kann sich damit ja mehr als nur ein Knoten qualifizieren.
Auch die darunterliegenden IF_IXML_* Interfaces bieten leider keine XPATH-Suche mit mehreren Ergebnissen.
Ich glaub du wirst wohl oder übel selbst durch den XML Tree navigieren müssen.
Wichtige Funktionen hierfür sind CREATE_ITERATOR bzw. CREATE_ITERATOR_FILTERED und CREATE_FILTER_*
Auch gut die GET_CHILDREN Methode oder FIND_FROM_NAME.
Am Besten immer vom Dokument-Root ausgehen (Type IF_IXML_DOCUMENT)
lg ADT
Code: Alles auswählen.
CALL METHOD lr_owndoc->get_elements_by_tag_name
EXPORTING
* depth = 0
name = 'Knoten'
* namespace = ''
RECEIVING
rval = lr_ncollect.
CALL METHOD lr_ncollect->get_length "wie viele sind vorhanden?
RECEIVING
rval = lv_length.
CALL METHOD lr_ncollect->create_iterator
RECEIVING
rval = lr_iterator.
DO lv_length TIMES.
CLEAR lr_node.
CALL METHOD lr_iterator->get_next
RECEIVING
rval = lr_node.
CALL METHOD lr_node->get_name
RECEIVING
rval = lv_name.
CALL METHOD lr_node->get_value
RECEIVING
rval = lv_value.
WRITE: / lv_value.
ENDDO.
Code: Alles auswählen.
lr_ncollect_lvl1 = lr_owndoc->get_elements_by_tag_name( name = 'Knoten' ).
lr_iterator_lvl1 = lr_ncollect_lvl1->create_iterator( ).
lr_node_lvl1 = lr_iterator_lvl1->get_next( ).
while lr_node_lvl1 is bound.
lr_ncollect_lvl2 = lr_node_lvl1->get_elements_by_tag_name( name = 'Reference1' ).
lr_iterator_lvl2 = lr_ncollect_lvl2->create_iterator( ).
lr_node_lvl2 = lr_iterator_lvl2->get_next( ).
while lr_node_lvl2 is bound.
lv_name = lr_node_lvl2->get_name( ).
lv_value = lr_node_lvl2->get_value( ).
WRITE: /, lv_name, lv_value.
lr_node_lvl2 = lr_iterator_lvl2->get_next( ).
endwhile.
lr_node_lvl1 = lr_iterator_lvl1->get_next( ).
endwhile.
Code: Alles auswählen.
CALL METHOD lr_node->get_owner_document
RECEIVING
rval = lr_owndoc.
CALL METHOD lr_owndoc->get_elements_by_tag_name
EXPORTING
* depth = 0
name = 'REFERENCE1'
* namespace = ''
RECEIVING
rval = lr_ncollect2. "<- hier kommt ein Objekt zurück
Code: Alles auswählen.
data: lr_element type ref to if_ixml_element.
lr_ncollect_lvl1 = lr_owndoc->get_elements_by_tag_name( name = 'Knoten' ).
lr_iterator_lvl1 = lr_ncollect_lvl1->create_iterator( ).
lr_node_lvl1 = lr_iterator_lvl1->get_next( ).
while lr_node_lvl1 is bound.
lr_element ?= lr_node_lvl1.
lr_ncollect_lvl2 = lr_element->get_elements_by_tag_name( name = 'Reference1' ).
lr_iterator_lvl2 = lr_ncollect_lvl2->create_iterator( ).
lr_node_lvl2 = lr_iterator_lvl2->get_next( ).
while lr_node_lvl2 is bound.
lv_name = lr_node_lvl2->get_name( ).
lv_value = lr_node_lvl2->get_value( ).
WRITE: /, lv_name, lv_value.
lr_node_lvl2 = lr_iterator_lvl2->get_next( ).
endwhile.
lr_node_lvl1 = lr_iterator_lvl1->get_next( ).
endwhile.
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
nitro3000