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 クラスによって定義されています: BOOLEAN、DOM_OBJECT_MODEL、NODE、NODESET、NUMBER、STRING。
次の例に示すように、<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 が使用されます。Node、Document、Source、File、String、InputStream、byte[] ペイロードから変換できるため、ほとんどの場合はこれで十分です。デフォルトの実装の機能を超えて拡張する必要がある場合は、ここでこの戦略のカスタム実装への参照を提供するよりも、アップストリーム Transformer の方がおそらく優れたオプションです。