32.2. XML DSL

基本的な式

XML DSL で XPath 式を評価するには、xpath 要素の中に XPath 式を入れます。XPath 式は、現在の In メッセージのボディーに適用され、XML ノード (またはノードセット) を返します。通常、返された XML ノードは自動的に文字列に変換されます。

たとえば、現在の In メッセージボディーから /person/name 要素の内容を抽出し、それを使用して user という名前のヘッダーを設定するには、以下のようなルートを定義することができます。

<beans ...>

  <camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
      <from uri="queue:foo"/>
      <setHeader headerName="user">
        <xpath>/person/name/text()</xpath>
      </setHeader>
      <to uri="direct:tie"/>
    </route>
  </camelContext>

</beans>

結果を特定の型に変換する場合は、resultType 属性を Java 型名 (ここでは完全修飾型名を指定する必要があります) に設定して、結果の型を指定します。たとえば、結果の型が java.lang.String であることを明示的に指定するには、以下を実行します (ここでは java.lang. 接頭辞を省略できます)。

<xpath resultType="String">/person/name/text()</xpath>

Namespaces

要素が 1 つ以上の XML スキーマに属する文書を処理する場合、通常、名前空間 URI を接頭辞で関連付ける必要があります。こうすることで XPath 式の中で要素名を明確に識別できるようにします。接頭辞を名前空間 URI に関連付けるための標準的な XML メカニズムを使用することができます。つまり、xmlns:Prefix="NamespaceURI" のような属性を設定することができます。

たとえば、接頭辞 cust を名前空間 http://acme.com/customer/record と関連付けて、要素 /cust:person/cust:name コンテンツを抽出するには、以下のようなルートを定義します。

<beans ...>

  <camelContext xmlns="http://camel.apache.org/schema/spring"
                xmlns:cust="http://acme.com/customer/record" >
    <route>
      <from uri="queue:foo"/>
      <setHeader headerName="user">
        <xpath>/cust:person/cust:name/text()</xpath>
      </setHeader>
      <to uri="direct:tie"/>
    </route>
  </camelContext>

</beans>

名前空間の監査

XPath 式を使用する際に最も頻繁に発生する問題の 1 つは、受信メッセージに表示される名前空間と XPath 式で使用される名前空間の間に不一致があることです。この種の問題のトラブルシューティングを支援するために、XPath 言語では、すべての受信メッセージからすべての名前空間をシステムログにダンプするオプションがサポートされています。

INFO ログレベルでネームスペースロギングを有効にするには、以下のように XML DSL で logNamespaces オプションを有効にします。

<xpath logNamespaces="true" resultType="String">/foo:person/@id</xpath>

あるいは、org.apache.camel.builder.xml.XPathBuilder ロガーで TRACE レベルのロギングを有効にするようにロギングシステムを設定することもできます。

名前空間のロギングを有効にすると、処理されたメッセージごとに以下のようなログメッセージが表示されます。

2012-01-16 13:23:45,878 [stSaxonWithFlag] INFO  XPathBuilder  -
Namespaces discovered in message: {xmlns:a=[http://apache.org/camel],
DEFAULT=[http://apache.org/default],
xmlns:b=[http://apache.org/camelA, http://apache.org/camelB]}