Zugriff auf XML-Document mittels XPATH

Hinweise, Tips und Tricks, FAQs - keine Anfragen!!
5 Beiträge • Seite 1 von 1
5 Beiträge Seite 1 von 1

Zugriff auf XML-Document mittels XPATH

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
hi!

Vor einiger Zeit wurde ich gefragt wie es möglich ist mit den in ABAP vorhandenen Funktionen auf mehrere Knoten in einem XML-Document zuzugreifen.
Mein Mittel der Wahl in ABAP sind für solche Aufgaben die IXML-Klassen und Interfaces. Nur haben die einen entscheidenden Nachteil wie ich damals feststellen musste: Ein Zugriff per Pfadangabe ist nur auf einzelne Knoten möglich und XPATH wird praktisch nicht unterstützt.

Ich muss ehrlicherweise gestehen, dass ich das zu der Zeit einfach noch nicht gebraucht hatte bzw. zu faul war eine passende Lösung zu suchen. :oops:
Aber der Teufel schläft nicht und daher musste ich vor kurzem selbst eine Möglichkeit finden um mit XPATH möglichst effizient auf Knoten innerhalb eines Dokuments zugreifen.
Also hab ich erst Mal nach einer Klasse mit Namen XPATH gesucht und die CL_PROXY_XPATH gefunden. Das war auch schon der wichtigste Fund überhaupt. Zwar ist hiermit nur eine Verarbeitung von XSTRING möglich und man kann keine Manipulationen damit durchführen, aber ich hab bei Durchsicht des Codings bemerkt, dass intern eigentlich nur auf den CL_XSLT_PROCESSOR zugegriffen wird.
Der Rest war ein Kinderspiel. Ich hab mir einfach das wichtigste Coding rauskopiert und an meine Anforderung angepasst:

Code: Alles auswählen.

data:
  lr_processor type ref to cl_xslt_processor,
  lr_document type ref to if_ixml_document,
  lr_collection  TYPE REF TO if_ixml_node_collection,
  ld_xpath type STRING.

  CREATE OBJECT lr_processor.
  lr_processor->set_source_node( node = lr_document ). "Den Prozessor mit dem Dokument verknüpfen
  lr_processor->set_expression( expression = ld_xpath ). "Die XPATH Query übergeben
  lr_processor->run( progname = space ). "Die Query verarbeiten
  lr_collection = lr_processor->get_nodes( ). "Das Ergebnis
Mit der Node-Collection kann man dann wie gewohnt alles mögliche anstellen, auch die Knoten ändern.
Wenn man sich dann die Daten aus dem Document wieder als STRING oder ähnliches holt hat man das veränderte Ergebnis.

so long.
ADT

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag (Insgesamt 3):
ewxbancbanusfr-g

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

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


Re: Zugriff auf XML-Document mittels XPATH

Beitrag von Falloutboy3k (ForumUser / 11 / 0 / 0 ) »
Hallo zusammen,

@ADT: deine Lösung zur Realisierung von XPATH-Abfragen ist wirklich elegant :)
Ich versuchte das gerade in gleicher Art zu implementieren, bekam aber ein Problem mit der Methode lr_processor->run(). Als Parameter soll hier der XSLT-Programmname übergeben werden. Gibt es dafür evtl. ein Standardprogramm, da es sich ja sozusagen um ein 1 zu 1 Mapping handelt?

Schon mal danke im Voraus und viele Grüße,
Falloutboy3k

Re: Zugriff auf XML-Document mittels XPATH

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
Ja, wenn du mein Coding anschaust ist einfach als Programmname ein Leerstring (oder SPACE) zu übergeben.
Kann aber sein, dass das mit einem aktuelleren Release als unserem nicht mehr möglich ist.
Schau dir einfach mal die Methode CL_PROXY_XPATH=>RUN an. Die sollte in diesem Fall den richtigen Aufruf parat haben.

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-Document mittels XPATH

Beitrag von mydoghasworms (ForumUser / 1 / 0 / 0 ) »
Ich schreibe eigentlich nur hier um mein Deutsch zu üben (dies ist mein erstes Post).

Hier ist ein Beispiel wo CL_PROXY_XPATH direkt angewendet wird:

Code: Alles auswählen.

data(xpp) = new cl_proxy_xpath( ).
xpp->set_source_string( smis-request_payload ). "Dein XML Dokument als STRING
xpp->run( expression = '//element1/subelement2' ).
data(nodes) = xpp->get_nodes( ).
"Die Werte von alle zurückgegebene Knoten ermitteln:
data(node) = nodes->get_next( ).
while node is bound.
  write: / node->get_value( ).
  node = nodes->get_next( ).
endwhile.
Dieses hat aber das Problem, das die Ausnahme CX_XSLT_RUNTIME_ERROR nicht aufgefangen wird und es zu einem Dump führen kann. Stattdessen habe ich eine kleine Utility Klasse geschrieben womit ich in mein Programm viele XPath Anfragen ausführe:

Code: Alles auswählen.

* LCL_XPATH_UTIL is just a simple wrapper for CL_XSLT_PROCESSOR
* to facilitate one-shot XPath queries on XML strings
class lcl_xpath_util definition.
  public section.
    data: xp type ref to cl_xslt_processor.
    methods: constructor,
      query importing xml          type clike
                      query        type clike
            returning value(nodes) type ref to if_ixml_node_iterator.
endclass.
class lcl_xpath_util implementation.
  method constructor.
    create object xp.
  endmethod.
  method query.
    try.
        xp->set_source_string( xml ).
        xp->set_expression( query ).
        xp->run( ' ' ).
        data(node_list) = xp->get_nodes( ).
        if node_list is bound and node_list->get_length( ) > 0.
          nodes = node_list->create_iterator( ).
        endif.
      catch cx_xslt_runtime_error.
    endtry.
  endmethod.
endclass.

...

data(lr_xu) = new lcl_xpath_util( ).
data(nodes) = lr_xu->query( query = '//Log/Item' xml = ls_smis-response_payload ).
(Mein Deutsch ist vielleicht ein bischen ulkig - es ist eben nicht meine Primärsprache).

Re: Zugriff auf XML-Document mittels XPATH

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
Nachdem ich jetzt schon selber mehrfach in Problem mit Namespaces gelaufen bin, hier noch eine Ergänzug zu meinem ursprünglichen Coding.

Code: Alles auswählen.

data:
  lr_processor type ref to cl_xslt_processor,
  lr_document type ref to if_ixml_document,
  lr_collection  TYPE REF TO if_ixml_node_collection,
  ld_namespace TYPE string
  ld_xpath TYPE string.

* z.B. für den Namespace 'xmlns="urn:hl7-org:v3"' im Quelldokument
  ld_namespace = 'hl7 urn:hl7-org:v3'.
  ld_xpath = 'hl7:ClinicalDocument/hl7:documentationOf/hl7:serviceEvent/hl7:code'.

  lr_processor = new #( ). 
  lr_processor->set_source_node( node = lr_document ). "Den Prozessor mit dem Dokument verknüpfen
  lr_processor->set_expression( expression = ld_xpath "Die XPATH Query übergeben
                                nsdeclarations = ld_namespace ). "Das Namespace-Mapping übergeben
  lr_processor->run( progname = space ). "Die Query verarbeiten
  lr_collection = lr_processor->get_nodes( ). "Das Ergebnis
Wird für das Quelldokument ein Namespace mit "xmlns" (global ohne Alias) definiert, dann ist dieser für den XSLT Prozessor durch einen lokalen Alias zu ersetzen.
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

1
Antw.
4291
Views
Zugriff mittels VBA auf Remotebaustein
von jocoder » 19.06.2017 16:15 • Verfasst in Exchange Infrastructure
0
Antw.
2178
Views
Document Viewer
von joffi68 » 17.07.2007 14:29 • Verfasst in Basis
0
Antw.
2166
Views
DOCUMENT VIEWER
von SAP_ENTWICKLER » 17.01.2015 15:34 • Verfasst in ABAP® Core
0
Antw.
1054
Views
Lieferpläne mit Document Type LZ
von itmeli » 17.01.2006 09:23 • Verfasst in Sales and Distribution
0
Antw.
1365
Views
Business Document Server
von Deniz » 27.05.2011 16:52 • Verfasst in ABAP® Core

Aktuelle Forenbeiträge

Eclipse - warum/wann verwendet ihr es [nicht]
vor einer Stunde von tar 11 / 842
Zeilenumbrüche ersetzen
vor 18 Stunden von ralf.wenzel 6 / 168
Dialog-Container mit Toolbar/Status
Gestern von tar gelöst 19 / 2329
SAP Trial Version für SAP Fiori
vor 2 Tagen von tar 2 / 1544

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

Eclipse - warum/wann verwendet ihr es [nicht]
vor einer Stunde von tar 11 / 842
Zeilenumbrüche ersetzen
vor 18 Stunden von ralf.wenzel 6 / 168
Dialog-Container mit Toolbar/Status
Gestern von tar gelöst 19 / 2329
SAP Trial Version für SAP Fiori
vor 2 Tagen von tar 2 / 1544

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
vor 2 Tagen von Bright4.5 1 / 608
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2237
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8829