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. Die dort verwendete Terminologie basiert auf der
Terminologie, die in der W3C-Definition von XPath 1.0 verwendet wird. Weitere
Informationen zu XPath finden Sie im Abschnitt XPath verwenden und weitere
Informationen zur W3C-Definition des Standards XPath 1.0 finden Sie im Abschnitt
W3C
XPath 1.0 Spezifikation.
Der MbXPath-Abschnitt in der Benutzerdefinierte Java-Knoten-API-Dokumentation enthält Beispiele für die Verwendung von XPath.
Dieser Abschnitt enthält die folgenden Informationen:
Nachrichteninformationen mithilfe der Methode 'evaluateXPath' extrahieren
Die Methode
evaluateXPath() ist in der benutzerdefinierten Java-Knoten-API enthalten. Sie unterstützt
XPath 1.0, wobei folgende Ausnahmen zu beachten sind:
- Namespace-Achse und Namespace-Knotentyp. Durch die Namespace-Achse werden die tatsächlichen Knoten der XML-Namespace-Deklaration 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 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 Namespacezuordnungen 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 die Möglichkeit eines Verweises auf Variablen, die bereits vor der Auswertung des Ausdrucks, in dem sie enthalten sind, 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:
- Boolean
- Knotengruppe
- Anzahl
- Zeichenfolge
XPath-Namespace-Unterstützung
In XML-Nachrichten wird mithilfe einer Zuordnung eines abgekürzten Namespacepräfix zur vollständigen Namespace-URI auf Namespaces 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 Namespacepräfix reicht zwar aus, um den Namespace darzustellen; es hat jedoch nur in dem Dokument Bedeutung, das diese Zuordnung definiert. Die globale Bedeutung wird durch die Namespace-URI definiert. Ebenso hat das Konzept des Namespacepräfix keine Bedeutung für Dokumente, die in einem Nachrichtenfluss generiert wurden, da eine Namespace-URI ohne Definition einer XMLNS-Zuordnung zu einem Syntaxelement zugeordnet werden kann.
Aus diesem Grund legen die XMLNSC- und MRM-Parser die Namespace-URI nur für den Broker und den Benutzercode (ESQL oder benutzerdefinierter Code) offen. Mittels ESQL können Sie eigene Zuordnungen einrichten, um Abkürzungen für URIs, die sehr lang sein können, 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).
Mithilfe des XPath-Prozessors können Sie Namespaceabkürzungen zu URIs zuordnen, die während der Auswertung erweitert werden. Die MbXPath-Klasse enthält Methoden zum Zuordnen und Entfernen dieser Namespace-Zuordnungen. Beispiel:
MbXPath xp = new MbXPath("/aaa/other:aaa/bbb");
xp.addNamespacePrefix("other", "http://mydomain.com/namespace2");
xp.setDefaultNamespace("http://mydomain.com/namespace2");
List nodeset = (List)message.evaluateXPath(xp);
Nachricht mithilfe 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 werden würde.
- set-namespace-uri(Objekt)
- Legt für die Namespace-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 werden würde.
- 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 werden würde.
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 Namen ü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.