使用 XPath 轉換 XML 訊息
當涉及到訊息轉換時,XPath 是轉換具有 XML Payload 訊息的絕佳方式。您可以使用 <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 訊息轉換為 Payload 為 '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
屬性來設定所需的類型,如下列範例所示(兩次)
<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
實作的參考(XPathOperations
實作使用的介面,用於在每個節點的基礎上映射 Node
物件)。若要提供對 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 Payload 轉換器
您也可以使用 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[]
Payload 進行轉換。如果您需要擴展超出該預設實作的功能,則上游 Transformer
可能比在此處提供對此策略的自訂實作的參考更好。