Informationen mit Hilfe von XPath 1.0 und einem Java-Rechenknoten aus einer Nachricht extrahieren

XPath wurde zwar für die Verwendung mit XML-Dokumenten entworfen, kann aber zu Abfragezwecken auch auf anderen Baumstrukturen angewendet werden. WebSphere Message Broker wählt Elemente unabhängig vom Format des Bitstroms aus der logischen Nachrichtenbaumstruktur aus. Weitere Informationen zu XPath und der W3C-Definition des XPath 1.0-Standards finden Sie unter XPath. Die dort verwendete Terminologie basiert auf der Terminologie, die in der W3C-Definition von XPath 1.0 verwendet wird.

Dieser Abschnitt enthält die folgenden Informationen:

Nachrichteninformationen mit Hilfe der Methode 'evaluateXPath' extrahieren

Die Methode 'evaluateXPath()' ist in der benutzerdefinierten Java-Knoten-API enthalten und unterstützt XPath 1.0 mit den folgenden Ausnahmen:
  • Namensbereichsachse und Namensbereichsknotentyp. Durch die Namensbereichsachse werden die tatsächlichen Knoten der XML-Namensbereichsdeklaration für ein bestimmtes Element wiedergegeben. Dadurch können Sie XML-Präfixe oder URI-Deklarationen in einem XPath-Ausdruck ändern. Die Achse gibt für Bitströme ohne XML eine leere Knotengruppe zurück.
  • Bei der Verwendung der Funktion 'id()' wird die Ausnahmebedingung 'MbRecoverableException' ausgelöst.

Die Methode 'evaluateXPath()' wird in einem MbMessage-Objekt (für absolute Pfade) oder in einem MbElement-Objekt (für relative Pfade) aufgerufen. Der XPath-Ausdruck wird als Zeichenfolgeparameter an die Methode übermittelt. Es wird auch ein zweites Format dieser Methode für ein MbXPath-Objekt bereitgestellt. Dieses Objekt bindet einen XPath-Ausdruck mit variablen Bindungen und Namensbereichszuordnungen ein, falls diese erforderlich sind.

Durch die Methode 'evaluateXPath()' wird je nach Rückgabetyp des Ausdrucks ein Objekt mit einem der folgenden vier Typen zurückgegeben:
  • java.lang.Boolean für den Booleschen XPath-Typ
  • java.lang.Double für den XPath-Nummerntyp
  • java.lang.String für den XPath-Zeichenfolgetyp
  • java.util.List für die XPath-Knotengruppe. Die Schnittstelle 'List' stellt eine geordnete Reihe von Objekten, in diesem Fall MbElementen, dar. Damit wird der direkte Zugriff auf die Elemente oder der Abruf eines Iterators oder eines MbElement-Bereichs ermöglicht.

XPath-Variablenbindung

XPath 1.0 unterstützt den Verweis auf Variablen in einem Ausdruck, die vor der Auswertung zugeordnet wurden. Die MbXPath-Klasse verfügt über drei Methoden, mit denen diese Variablenbindungen im Java-Benutzercode zugeordnet und von dort entfernt werden können. Der Wert muss dabei einem der folgenden vier unterstützten XPath 1.0-Typen entsprechen:
  • Boolesch
  • Knotengruppe
  • Anzahl
  • Zeichenfolge

XPath-Namensbereichsunterstützung

In XML-Nachrichten wird mit Hilfe einer Zuordnung von einem abgekürzten Namensbereichspräfix für die vollständige Namensbereichs-URI auf Namensbereiche verwiesen; dies wird im folgenden XML-Beispiel gezeigt:
<ns1:aaa xmlns:ns1='http://mydomain.com/namespace1'
         xmlns:ns2='http://mydomain.com/namespace2'>
  <ns2:aaa>
    <ns1:bbb/>
  </ns2:aaa>
</ns1:aaa>

Das Namensbereichspräfix reicht zwar aus, um den Namensbereich darzustellen; es hat jedoch nur in dem Dokument Bedeutung, das diese Zuordnung definiert. Die globale Bedeutung wird durch die Namensbereichs-URI definiert. Ebenso hat das Konzept des Namensbereichspräfix keine Bedeutung für Dokumente, die in einem Nachrichtenfluss generiert wurden, da eine Namensbereichs-URI ohne Definition einer xmlns-Zuordnung zu einem Syntaxelement zugeordnet werden kann.

Aus diesem Grund legen die XMLNS(C)- und MRM-Parser die Namensbereichs-URI nur für den Broker und den Benutzercode (ESQL oder Plug-in-Code) offen. Durch ESQL können Benutzer ihre eigenen Zuordnungen definieren, um für diese unter Umständen langen URIs Abkürzungen zu erstellen. Diese Zuordnungen haben keinen Zusammenhang mit den Präfixen, die im XML-Dokument definiert sind (sie können jedoch den gleichen Namen haben).

Mit Hilfe des XPath-Prozessors können Sie Namensbereichsabkürzungen zu URIs zuordnen, die während der Auswertung erweitert wurden. Die MbXPath-Klasse enthält Methoden zum Zuordnen und Entfernen dieser Namensbereichszuordnungen. Auf das XML-Beispiel kann mit folgender Methode zugegriffen werden:
MbMessage msg = assembly.getMessage();
List chapters= (List)msg.evaluateXPath("/document/chapter");
// Gibt eine Liste aller Kapitel im Dokument zurück (Länge 1)

MbElement chapter = (MbElement)chapters.get(0);  // erstes Kapitel

// Die Werte können mit Hilfe von XPath auch direkt extrahiert werden
String title = (String)msg.evaluateXPath("string(/document/chapter/@title)");

String chapterText = (String)msg.evaluateXPath("string(/document/chapter/text())");

Nachricht mit Hilfe von XPath-Ausdrücken aktualisieren

Bei der Implementierung von XPath durch WebSphere Message Broker werden die folgenden zusätzlichen Funktionen zum Ändern der Nachrichtenbaumstruktur bereitgestellt:
set-local-name(Objekt)
Legt für den lokalen Teil des erweiterten Namens im Kontextknoten den im Argument angegebenen Wert fest. Das Objekt, bei dem es sich um einen beliebigen gültigen Ausdruck handeln kann, wird in eine Zeichenfolge umgewandelt, als ob ein Aufruf für die Zeichenfolgefunktion verwendet worden wäre.
set-namespace-uri(Objekt)
Legt für die Namensbereichs-URI des erweiterten Namens im Kontextknoten den im Argument angegebenen Wert fest. Das Objekt, bei dem es sich um einen beliebigen gültigen Ausdruck handeln kann, wird in eine Zeichenfolge umgewandelt, als ob ein Aufruf für die Zeichenfolgefunktion verwendet worden wäre.
set-value(Objekt)
Durch diese Funktion wird für den Zeichenfolgewert des Kontextknotens der im Argument angegebene Wert festgelegt. Das Objekt, bei dem es sich um einen beliebigen gültigen Ausdruck handeln kann, wird in eine Zeichenfolge umgewandelt, als ob ein Aufruf für die Zeichenfolgefunktion verwendet worden wäre.
Damit Syntaxelement-Baumstrukturen erstellt und geändert werden können, steht zusätzlich zu den 13 in der XPath 1.0-Spezifikation definierten Achsen die folgende Achse zur Verfügung:
select-or-create::Name oder ?Name
?Name entspricht select-or-create::Name. Wenn es sich bei Name um '@name' handelt, wird ein Attribut erstellt oder ausgewählt. Dadurch werden untergeordnete Knoten ausgewählt, die mit dem angegebenen Namenstest übereinstimmen, oder es werden gemäß den folgenden Regeln neue Knoten erstellt:
  • ?Name wählt untergeordnete Elemente mit der Bezeichnung Name aus, falls diese vorhanden sind. Falls kein untergeordnetes Element mit der Bezeichnung Name vorhanden ist, wird es von ?Name als letztes untergeordnetes Element erstellt und anschließend ausgewählt.
  • ?$Name erstellt Name als letztes untergeordnetes Element und wählt es anschließend aus.
  • ?^Name erstellt Name als erstes untergeordnetes Element und wählt es anschließend aus.
  • ?>Name erstellt Name als nächstes gleichgeordnetes Element und wählt es anschließend aus.
  • ?<Name erstellt Name als vorhergehendes gleichgeordnetes Element und wählt es anschließend aus.
Zugehörige Informationen
Benutzerdefinierte Java-Knoten-API
Bemerkungen | Marken | Downloads | Bibliothek | Unterstützung | Rückmeldung
Copyright IBM Corporation 1999, 2006 Letzte Aktualisierung: 23. Aug. 2006
ac30390_