XPath を使用した XML メッセージの変換

メッセージの変換に関しては、XPath は XML ペイロードを持つメッセージを変換する優れた方法です。そのためには、<xpath-transformer/> 要素を使用して XPath トランスフォーマーを定義します。

単純な XPath 変換

次のトランス構成を検討してください。

<int-xml:xpath-transformer input-channel="inputChannel" output-channel="outputChannel"
      xpath-expression="/person/@name" />

次の Message も考慮してください。

Message<?> message =
  MessageBuilder.withPayload("<person name='John Doe' age='42' married='true'/>").build();

このメッセージを "inputChannel" に送信した後、以前に構成された XPath トランスフォーマーは、xpath-expression 属性で指定された単純な XPath 式に基づいて、この XML メッセージを "John Doe" のペイロードを持つ単純な Message に変換します。

XPath を使用すると、抽出した要素を目的の型に簡単に変換することもできます。有効な戻り値の型は javax.xml.xpath.XPathConstants で定義され、javax.xml.xpath.XPath インターフェースで指定された変換規則に従います。

次の定数は、XPathConstants クラスによって定義されています: BOOLEANDOM_OBJECT_MODELNODENODESETNUMBERSTRING

次の例に示すように、<xpath-transformer/> 要素の evaluation-type 属性を使用して、目的の型を構成できます(2 回)。

<int-xml:xpath-transformer input-channel="numberInput" xpath-expression="/person/@age"
                           evaluation-type="NUMBER_RESULT" output-channel="output"/>

<int-xml:xpath-transformer input-channel="booleanInput"
                           xpath-expression="/person/@married = 'true'"
                           evaluation-type="BOOLEAN_RESULT" output-channel="output"/>

ノードマッパー

XPath 式によって抽出されたノードにカスタムマッピングを提供する必要がある場合、org.springframework.xml.xpath.NodeMapper の実装(Node オブジェクトをノードごとにマッピングするために XPathOperations 実装で使用されるインターフェース)への参照を提供できます。NodeMapper への参照を提供するには、次の例に示すように、node-mapper 属性を使用できます。

<int-xml:xpath-transformer input-channel="nodeMapperInput" xpath-expression="/person/@age"
                           node-mapper="testNodeMapper" output-channel="output"/>

次の例は、前述の例と連携する NodeMapper 実装を示しています。

class TestNodeMapper implements NodeMapper {
  public Object mapNode(Node node, int nodeNum) throws DOMException {
    return node.getTextContent() + "-mapped";
  }
}

XML ペイロードコンバーター

org.springframework.integration.xml.XmlPayloadConverter の実装を使用して、よりきめ細かな変換を提供することもできます。次の例は、定義方法を示しています。

<int-xml:xpath-transformer input-channel="customConverterInput"
                           output-channel="output" xpath-expression="/test/@type"
                           converter="testXmlPayloadConverter" />

次の例は、前述の例で機能する XmlPayloadConverter 実装を示しています。

class TestXmlPayloadConverter implements XmlPayloadConverter {
  public Source convertToSource(Object object) {
    throw new UnsupportedOperationException();
  }
  //
  public Node convertToNode(Object object) {
    try {
      return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(
          new InputSource(new StringReader("<test type='custom'/>")));
    }
    catch (Exception e) {
      throw new IllegalStateException(e);
    }
  }
  //
  public Document convertToDocument(Object object) {
    throw new UnsupportedOperationException();
  }
}

この参照を指定しない場合は、DefaultXmlPayloadConverter が使用されます。NodeDocumentSourceFileStringInputStreambyte[] ペイロードから変換できるため、ほとんどの場合はこれで十分です。デフォルトの実装の機能を超えて拡張する必要がある場合は、ここでこの戦略のカスタム実装への参照を提供するよりも、アップストリーム Transformer の方がおそらく優れたオプションです。