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
の方がおそらく優れたオプションです。