XPath は XML 文書と共に使用するように設計された照会言語ですが、内容を照会する任意のツリー構造で使用できます。
WebSphere® Message
Broker は XPath を使用して、
ビット・ストリームの形式には関係なく論理メッセージ・ツリーからエレメントを選択します。 このトピックで使用される用語は、XPath 1.0 の W3C 定義での用語に基づいています。 XPath の詳細については、XPath の使用を参照してください。XPath 1.0 規格の W3C 定義については、W3C XPath 1.0 Specificationを参照してください。
XPath の使用例については、Java ユーザー定義ノード API 資料の MbXPath トピックを参照してください。
evaluateXPath メソッドを使用する情報の抽出
evaluateXPath() メソッドは、Java ユーザー定義ノード API に組み込まれています。 これは、XPath 1.0 をサポートしますが、次のような例外があります。
- ネーム・スペース軸および namespace ノード・タイプ。 ネーム・スペース軸は、特定のエレメントに対する実際の XML ネーム・スペース宣言ノードを戻します。
したがって、XPath 式の中で XML プレフィックスまたは URI 宣言を取り扱うことができます。 この軸は、XML ではないビット・ストリームに対して空のノード・セットを戻します。
- id() 関数を使用する場合、それは MbRecoverableException をスローします。
evaluateXPath() メソッドは、MbMessage オブジェクト (絶対パスのため)、
または MbElement オブジェクト (相対パスのため) に関して呼び出すことができます。 XPath 式は、メソッドにストリング・パラメーターとして渡されます。 このメソッドの 2 番目の形式が提供されていて、それは MbXPath オブジェクトを使用するものです。 このオブジェクトは、XPath 式を変数バインディングおよびネーム・スペース・マッピング (これらが必要な場合) と共にカプセル化します。
evaluateXPath() メソッドは、式戻りタイプに応じて、これら 4 つのタイプのオブジェクトの 1 つを戻します。
- java.lang.Boolean、これは XPath ブール・タイプを表します。
- java.lang.Double、これは XPath 数値タイプを表します。
- java.lang.String、これは XPath ストリング・タイプを表します。
- java.util.List、これは XPath ノード・セットを表します。 リスト・インターフェースは、オブジェクト (この場合は MbElement) の順序付きシーケンスを表します。
これはエレメントへの直接アクセス、または Iterator または MbElement 配列を取得する機能を可能にします。
XPath 変数バインディング
XPath 1.0 は、変数を使った式の評価の前に割り当てられた変数を参照する機能をサポートします。 MbXPath クラスには、ユーザー Java コードでのこれらの変数バインディングの割り当てと除去のための 3 つのメソッドがあります。
その値は、XPath 1.0 によってサポートされる 4 つのタイプのいずれかである必要があります。
XPath ネーム・スペースのサポート
XML メッセージでは、以下の XML 例に示されているように、ネーム・スペースが省略された
ネーム・スペース・プレフィックスから完全なネーム・スペースの URI へのマッピングを使用して参照されます。
<ns1:aaa xmlns:ns1='http://mydomain.com/namespace1'
xmlns:ns2='http://mydomain.com/namespace2'>
<ns2:aaa>
<ns1:bbb/>
</ns2:aaa>
</ns1:aaa>
ネーム・スペース・プレフィックスはネーム・スペースを表すために便利ですが、それはそのマッピングが定義された文書内でのみ意味を持ちます。 ネーム・スペース URI はグローバルな意味を定義します。 さらに、ネーム・スペース URI は XMLNS マッピングが定義されていなくても構文エレメントに割り当てることができるので、
ネーム・スペース・プレフィックスの概念はメッセージ・フロー内で生成された文書に対して意味を持ちません。
このため、XMLNSC パーサーおよび MRM パーサーはネーム・スペース URI だけを
ブローカーおよびユーザー・コード (ESQL またはユーザー定義コード) に対して公開します。 長くなる可能性のある URI への省略形を作成するため独自のマッピングを ESQL を使用してセットアップできます。 これらのマッピングは、XML 文書内で定義されたプレフィックスと (同じ名前にすることはできますが) 何の関係もありません。
XPath プロセッサーを使用して、ネーム・スペースの省略形を URI にマップし、評価時に拡張することができます。 MbXPath クラスには、これらのネーム・スペース・マッピングを割り当てたり除去するためのメソッドが含まれています。 以下に例を示します。
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);
XPath 拡張を使用するメッセージの更新
WebSphere Message
Broker の XPath インプリメンテーションは、
メッセージ・ツリーを変更するための以下の追加の機能を提供します。
- set-local-name(object)
- コンテキスト・ノードの拡張された名前のローカル部分を、引数に指定された値に設定します。 object は、任意の有効な式とすることができ、
ストリング関数への呼び出しが使用される場合と同様にストリングに変換されます。
- set-namespace-uri(object)
- コンテキスト・ノードの拡張された名前のネーム・スペース URI 部分を、引数に指定された値に設定します。 object は、任意の有効な式とすることができ、
ストリング関数への呼び出しが使用される場合と同様にストリングに変換されます。
- set-value(object)
- この機能は、コンテキスト・ノードのストリング値を、引数で指定された値に設定します。 object は、任意の有効な式とすることができ、
ストリング関数への呼び出しが使用される場合と同様にストリングに変換されます。
構文エレメント・ツリーを構築および変更できるようにするために、
XPath 1.0 仕様で定義されている 13 に加えて、以下の軸が使用可能です。
- select-or-create::name or ?name
- ?name is equivalent to select-or-create::name.
name が @name の場合、属性が作成または選択されます。
これにより、以下の規則に従って、指定された名前と一致する子ノードが選択されるか、
または新規のノードが作成されます。
- ?name は、存在する場合に name と呼ばれる子を選択します。 name と呼ばれる子が存在しない場合、?name はそれを最後の子として作成してから、
それを選択します。
- ?$name は name を最後の子として作成してから、それを選択します。
- ?^name は name を最初の子として作成してから、それを選択します。
- ?>name は name を次の兄弟として作成してから、それを選択します。
- ?<name は name を直前の兄弟として作成してから、それを選択します。