Zugriff auf XML mit mehreren Elementen unter Wurzelknoten

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
12 Beiträge • Seite 1 von 1
12 Beiträge Seite 1 von 1

Zugriff auf XML mit mehreren Elementen unter Wurzelknoten

Beitrag von nitro3000 (ForumUser / 6 / 1 / 0 ) »
Hallo ich habe folgende Problem,

Mit der Klasse cl_xml_document und eines XPath ermittle ich wie folgt die Node der XML:
CALL METHOD lr_xml->find_node
EXPORTING
name = lv_xpath
RECEIVING
node = lr_node.

Und setze anschließend den Wert dieser Node mit der Methode lr_node->set_value( ) um.

Das funktioniert bei den Standartfällen auch reibungslos, sobald die XML-Nachricht aber mehrere Elemente unter einer Wurzel beinhaltet funktioniert es nicht mehr.
als Beispiel, um dies zu besser veranschaulichen zu können:

<Wurzelelement>
<Knoten>
<Reference1>aaaa</Reference1>
</Knoten>
<Knoten>
<Reference1>bbbb</Reference1>
</Knoten>
</Wurzelelement>

Der XPATH wäre also wie folgt: Wurzelelement/Knoten/Reference1
Mit der oben gennanten Methode erhalte ich also immer nur die Reference1 mit dem Wert "aaaa", die Node zur Reference1 mit dem Wert "bbbb" erhalte ich jedoch mit der Methode nicht.

Wie kann ich nun beide (bzw. es können 1-x sein) erhalten und bearbeiten?
Zuletzt geändert von nitro3000 am 14.03.2013 09:08, insgesamt 1-mal geändert.

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Zugriff auf XML mit mehreren Elementen unter Wurzelknote

Beitrag von a-dead-trousers (Top Expert / 4274 / 213 / 1140 ) »
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
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Zugriff auf XML mit mehreren Elementen unter Wurzelknote

Beitrag von nitro3000 (ForumUser / 6 / 1 / 0 ) »
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
Hallo,
danke schon mal für die schnelle Antwort, aber ich versteh nicht so ganz wie ich die oben genannten Methoden denn genau anwenden sollte? Hast du evtl. ein Beispiel parat oder kannst es per Pseudocode beschreiben?

lg,
n3000

Re: Zugriff auf XML mit mehreren Elementen unter Wurzelknote

Beitrag von a-dead-trousers (Top Expert / 4274 / 213 / 1140 ) »
Ich würde so vorgehen:
- Suche nach allen Knoten mit dem Namen "Knoten" (IF_IXML_ELEMENT->GET_ELEMENTS_BY_TAG_NAME)
- Das Ergebnis ist eine NODE_COLLECTION (IF_IXML_NODE_COLLECTION)
- Diese kann man entweder per ITERATOR (IF_IXML_NODE_ITERATOR) und GET_NEXT oder direct per GET_ITEM und der Index Nummer durcharbeiten
- Die einzelnen gefunden Knoten aus dieser Liste wieder nach der nächsten Knoten-Ebene "Reference1" durchsuchen usw.

Der ITERATOR ist angeblich die bessere Wahl als die NODE_COLLETION per INDEX zu durchsuchen, weil die im Speicher verwaltete Liste keinen Index kennt und für jeden Zugriff auf z.B Index 10 alle davor liegenden Indizes abgefragt werden müssen ehe der Index 10 erreicht wird.

Ich hab das jetzt nicht nachgeprüft, hab aber bei allen meinen Impelmentierungen den Weg über den Iterator gewählt. Sicher ist Sicher ;)

Du musst schauen wie du bei der Klasse CL_XML_DOCUMENT an den tatsächlichen Dokumentknoten (type IF_IXML_DOCUMENT) oder alernativ an den Wurzelknoten (type IF_IXML_ELEMENT) des Dokuments rankommst um mit der Suche via GET_ELEMENTS_BY_TAG_NAME beginnen zu können.
Ich verwend die Klasse nämlich nicht sonder arbeite direkt mit der CL_IXML und den IF_IXML_*-Interfaces.

lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Zugriff auf XML mit mehreren Elementen unter Wurzelknote

Beitrag von nitro3000 (ForumUser / 6 / 1 / 0 ) »
Hallo,

ich habe deinen Vorschlag mal umgesetzt, die "Knoten" werden nun auch alle der Reihe nach abgearbeitet, das ist ja so soweit schon mal sehr gut.
Leider habe ich nun das Problem, dass ich auf den Unterknoten (z.b. "Reference1") nicht zugreifen kann..

Wenn ich mit der Methode get_value von if_ixml_node erhalte ich die gesamten Werte von "Knoten" in einem String , hierbei sind aber nur die werte hinterlegt, in unserem Beispiel für das 1. also "aaaa".

Wie kann ich das noch weiteraufsplitten?

danke schon mal für deine Mühen

Re: Zugriff auf XML mit mehreren Elementen unter Wurzelknote

Beitrag von a-dead-trousers (Top Expert / 4274 / 213 / 1140 ) »
Zeig mal wie dein Coding bisher ausschaut.
Ich vermuste du machst das GET_VALUE auf den falschen Knoten.

lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Zugriff auf XML mit mehreren Elementen unter Wurzelknote

Beitrag von nitro3000 (ForumUser / 6 / 1 / 0 ) »
klar..

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.

In der Methode get_next wird die Node zu "Knoten" zurückgeliefert, was mir auch klar ist, doch wie kann ich dann mit Hilfe genau dieser Node, den Unterknoten ermitteln?

Re: Zugriff auf XML mit mehreren Elementen unter Wurzelknote

Beitrag von a-dead-trousers (Top Expert / 4274 / 213 / 1140 ) »
Du musst innerhalb des Iterators nochmal auf mit GET_ELEMENTS_BY_TAG_NAME arbeiten.

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.
lg ADT

P.S.: Das GET_LENGTH kannst du dir sparen, da GET_NEXT am Ende ein leeres Objekt zurückliefert.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Zugriff auf XML mit mehreren Elementen unter Wurzelknote

Beitrag von nitro3000 (ForumUser / 6 / 1 / 0 ) »
Danke für den Codeschnippsel, doch die Methode get_elements_by_tag_name muss man über ein Objekt der Klasse if_ixml_document aufrufen

Hab das also dann wie folgt angepasst

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
wenn ich mir dann mit lr_iterator2->get_next() das Node-Objekt holen möchte kommt leider ein leeres Objekt zurück..

Re: Zugriff auf XML mit mehreren Elementen unter Wurzelknote

Beitrag von a-dead-trousers (Top Expert / 4274 / 213 / 1140 ) »
upsi, sorry hab vergessen:
Du musst den lr_node auf ein lr_element casten, damit die Methode GET_ELEMENTS_BY_TAG_NAME in der inneren Schleife zur Verfügung steht.
Also:

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.
lg ADT

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
nitro3000

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Zugriff auf XML mit mehreren Elementen unter Wurzelknote

Beitrag von nitro3000 (ForumUser / 6 / 1 / 0 ) »
Danke, jetzt klappt es endlich! :)

Re: Zugriff auf XML mit mehreren Elementen unter Wurzelknote

Beitrag von a-dead-trousers (Top Expert / 4274 / 213 / 1140 ) »
hi!

Hab noch eine Lösung mittels XPATH gefunden.

lg ADT

Edit: Nur noch ein Post... dann bin ich über 1000 :P
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Seite 1 von 1

Vergleichbare Themen

0
Antw.
923
Views
Logische Datenbank - Wurzelknoten
von littleJohn » 26.05.2008 15:55 • Verfasst in ABAP® Core
0
Antw.
3437
Views
Namensänderung von PSP Elementen
von jamyr » 27.11.2019 14:27 • Verfasst in Sales and Distribution
0
Antw.
1428
Views
Fakturierung von stat. PSP-Elementen möglich?
von Sumsi » 19.10.2006 10:04 • Verfasst in Sales and Distribution
1
Antw.
612
Views
Dropdown mit Elementen aus einer Tabelle
von Accetron » 26.01.2021 14:41 • Verfasst in ABAP® für Anfänger
1
Antw.
1833
Views
Dropdownbox mit mehreren Spalten
von Aggressor » 22.05.2006 14:04 • Verfasst in Web-Dynpro, BSP + BHTML

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

PDF-Anzeige unter EDGE
vor 4 Tagen von jocoder 2 / 69
Etikettendruck mit SmartForms
vor einer Woche von a-dead-trousers 2 / 71

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

PDF-Anzeige unter EDGE
vor 4 Tagen von jocoder 2 / 69
Etikettendruck mit SmartForms
vor einer Woche von a-dead-trousers 2 / 71

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Wochen von Lucyalison 1 / 129
Group Items auf einer Filterbar
vor 4 Wochen von Bright4.5 1 / 165