名前空間サポート

Spring Integration XML モジュール内のすべてのコンポーネントは、名前空間のサポートを提供します。名前空間のサポートを有効にするには、Spring Integration XML モジュールのスキーマをインポートする必要があります。次の例は、典型的なセットアップを示しています。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:int="http://www.springframework.org/schema/integration"
  xmlns:int-xml="http://www.springframework.org/schema/integration/xml"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    https://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/integration
    https://www.springframework.org/schema/integration/spring-integration.xsd
    http://www.springframework.org/schema/integration/xml
    https://www.springframework.org/schema/integration/xml/spring-integration-xml.xsd">
</beans>

XPath 式

Spring Integration XML モジュール内のコンポーネントの多くは、XPath 式で機能します。これらの各コンポーネントは、トップレベル要素として定義されている XPath 式を参照するか、ネストされた <xpath-expression/> 要素を使用します。

XPath 式のすべての形式により、Spring org.springframework.xml.xpath.XPathExpressionFactory を使用する XPathExpression が作成されます。XPath 式が作成されると、クラスパスで使用できる最適な XPath 実装が使用されます(JAXP 1.3 + または Jaxen、JAXP が推奨されます)。

内部的には、Spring Integration は Spring Web Services プロジェクト(www.spring.io/spring-ws (英語) )によって提供される XPath 機能を使用します。具体的には、Spring Web Services XML モジュール(spring-xml-x.x.x.jar)を使用します。より深い理解については、docs.spring.io/spring-ws/docs/current/reference/#xpath のそれぞれのドキュメントを参照してください。

以下は、xpath-expression エレメントで使用可能なすべての構成パラメーターの概要です。次のリストは、xpath-expression エレメントで使用可能な属性を示しています。

<int-xml:xpath-expression expression="" (1)
          id=""                         (2)
          namespace-map=""              (3)
          ns-prefix=""                  (4)
          ns-uri="">                    (5)
    <map></map>                         (6)
</int-xml:xpath-expression>
1XPath 式を定義します。必須。
2 基礎となる Bean 定義の識別子。org.springframework.xml.xpath.XPathExpression のインスタンスです。オプション。
3 名前空間を含むマップへの参照。マップのキーはネームスペースプレフィックスを定義し、マップの値はネームスペース URI を設定します。この属性と map 要素、または ns-prefix と ns-uri 属性の両方を指定することは無効です。オプション。
4 名前空間プレフィックスを XPath 式要素の属性として直接設定できます。ns-prefix を設定する場合、ns-uri 属性も設定する必要があります。オプション。
5 名前空間 URI を XPath 式要素の属性として直接設定できます。ns-uri を設定する場合、ns-prefix 属性も設定する必要があります。オプション。
6 名前空間を含むマップを定義します。map 子要素は 1 つのみ許可されます。マップのキーはネームスペースプレフィックスを定義し、マップの値はネームスペース URI を設定します。この要素と map 属性の両方を指定したり、ns-prefix および ns-uri 属性を設定したりすることは無効です。オプション。

XPath 式への名前空間(オプション)の提供

XPath Expression Element の場合、名前空間情報を構成パラメーターとして提供できます。次の選択肢のいずれかを使用して、名前空間を定義できます。

  • namespace-map 属性を使用してマップを参照する

  • map サブ要素を使用して名前空間のマップを提供します

  • ns-prefix および ns-uri 属性を指定します

3 つのオプションはすべて相互に排他的です。設定できるオプションは 1 つだけです。

次の例は、前述の XML 名前空間を設定するオプションなど、XPath 式を使用するいくつかの異なる方法を示しています。

<int-xml:xpath-filter id="filterReferencingXPathExpression"
                      xpath-expression-ref="refToXpathExpression"/>

<int-xml:xpath-expression id="refToXpathExpression" expression="/name"/>

<int-xml:xpath-filter id="filterWithoutNamespace">
    <int-xml:xpath-expression expression="/name"/>
</int-xml:xpath-filter>

<int-xml:xpath-filter id="filterWithOneNamespace">
    <int-xml:xpath-expression expression="/ns1:name"
                              ns-prefix="ns1" ns-uri="www.example.org"/>
</int-xml:xpath-filter>

<int-xml:xpath-filter id="filterWithTwoNamespaces">
    <int-xml:xpath-expression expression="/ns1:name/ns2:type">
        <map>
            <entry key="ns1" value="www.example.org/one"/>
            <entry key="ns2" value="www.example.org/two"/>
        </map>
    </int-xml:xpath-expression>
</int-xml:xpath-filter>

<int-xml:xpath-filter id="filterWithNamespaceMapReference">
    <int-xml:xpath-expression expression="/ns1:name/ns2:type"
                              namespace-map="defaultNamespaces"/>
</int-xml:xpath-filter>

<util:map id="defaultNamespaces">
    <util:entry key="ns1" value="www.example.org/one"/>
    <util:entry key="ns2" value="www.example.org/two"/>
</util:map>

デフォルトのネームスペースでの XPath 式の使用

デフォルトのネームスペースを使用する場合、予想とは異なる動作をする可能性があります。次の XML ドキュメント(2 冊のオーダーを表す)があるとします。

<?xml version="1.0" encoding="UTF-8"?>
<order>
    <orderItem>
        <isbn>0321200683</isbn>
        <quantity>2</quantity>
    </orderItem>
    <orderItem>
        <isbn>1590596439</isbn>
        <quantity>1</quantity>
    </orderItem>
</order>

このドキュメントは名前空間を宣言していません。次の XPath 式の適用は期待どおりに機能します。

<int-xml:xpath-expression expression="/order/orderItem" />

同じ式が次の XML ファイルでも機能すると予想される場合があります。

<?xml version="1.0" encoding="UTF-8"?>
<order xmlns="http://www.example.org/orders">
	<orderItem>
		<isbn>0321200683</isbn>
		<quantity>2</quantity>
	</orderItem>
	<orderItem>
		<isbn>1590596439</isbn>
		<quantity>1</quantity>
	</orderItem>
</order>

前の例は前の例とまったく同じに見えますが、デフォルトの名前空間を宣言しています。

ただし、この場合、以前の XPath 式(/order/orderItem)は失敗します。

この課題を解決するには、ns-prefix 属性と ns-uri 属性を設定するか、namespace-map 属性を設定して、名前空間プレフィックスと名前空間 URI を指定する必要があります。名前空間 URI は、XML ドキュメントで宣言された名前空間と一致する必要があります。前の例では、www.example.org/orders (英語) です。

ただし、ネームスペースプレフィックスは任意に選択できます。実際、空の文字列を指定すると実際に機能します。(ただし、null は許可されません)空の文字列で構成される名前空間プレフィックスの場合、Xpath 式はコロン(":")を使用してデフォルトの名前空間を示す必要があります。コロンを省略すると、XPath 式は一致しません。次の XPath 式は、前の例の XML ドキュメントと一致します。

<int-xml:xpath-expression expression="/:order/:orderItem"
    ns-prefix="" ns-uri="https://www.example.org/prodcuts"/>

また、他の任意に選択されたネームスペースプレフィックスを提供することもできます。次の XPath 式(myorder 名前空間プレフィックスを使用)も一致します。

<int-xml:xpath-expression expression="/myorder:order/myorder:orderItem"
    ns-prefix="myorder" ns-uri="https://www.example.org/prodcuts"/>

名前空間 URI は、プレフィックスではなく、本当に重要な情報です。Jaxen [GitHub] (英語) はポイントを非常にうまく要約しています。

XPath 1.0 では、接頭辞のない名前はすべて修飾されていません。XPath 式で使用されるプレフィックスが、クエリ対象のドキュメントで使用されるプレフィックスと同じである必要はありません。プレフィックスではなく、名前空間 URI のみが一致する必要があります。