拆分 XML 訊息
XPathMessageSplitter 支援載荷為 String 或 Document 的訊息。該拆分器使用提供的 XPath 表示式將載荷拆分為多個節點。預設情況下,這會導致每個 Node 例項成為新訊息的載荷。當每條訊息都應為 Document 時,您可以設定 createDocuments 標誌。當傳入 String 載荷時,該載荷會先被轉換,然後拆分,最後再轉換回多個 String 訊息。XPath 拆分器實現了 MessageHandler,因此應與適當的端點結合配置(請參閱以下示例之後的名稱空間支援示例,以獲取更簡單的配置替代方案)。以下示例配置了一個使用 XPathMessageSplitter 的 bean
<bean id="splittingEndpoint"
class="org.springframework.integration.endpoint.EventDrivenConsumer">
<constructor-arg ref="orderChannel" />
<constructor-arg>
<bean class="org.springframework.integration.xml.splitter.XPathMessageSplitter">
<constructor-arg value="/order/items" />
<property name="documentBuilder" ref="customisedDocumentBuilder" />
<property name="outputChannel" ref="orderItemsChannel" />
</bean>
</constructor-arg>
</bean>
XPath 拆分器名稱空間支援允許您建立具有輸入通道和輸出通道的訊息端點,如下例所示
<!-- Split the order into items and create a new message for each item node -->
<int-xml:xpath-splitter id="orderItemSplitter"
input-channel="orderChannel"
output-channel="orderItemsChannel">
<int-xml:xpath-expression expression="/order/items"/>
</int-xml:xpath-splitter>
<!-- Split the order into items, create a new document for each item-->
<int-xml:xpath-splitter id="orderItemDocumentSplitter"
input-channel="orderChannel"
output-channel="orderItemsChannel"
create-documents="true">
<int-xml:xpath-expression expression="/order/items"/>
<int:poller fixed-rate="2000"/>
</int-xml:xpath-splitter>
從 4.2 版本開始,當請求 payload 的型別不是 org.w3c.dom.Node 時,XPathMessageSplitter 會為 javax.xml.transform.Transformer 例項暴露 outputProperties(例如 OutputKeys.OMIT_XML_DECLARATION)屬性。以下示例定義了一個屬性並將其與 output-properties 屬性一起使用
<util:properties id="outputProperties">
<beans:prop key="#{T (javax.xml.transform.OutputKeys).OMIT_XML_DECLARATION}">yes</beans:prop>
</util:properties>
<xpath-splitter input-channel="input"
output-properties="outputProperties">
<xpath-expression expression="/orders/order"/>
</xpath-splitter>
從 4.2 版本開始,XPathMessageSplitter 暴露了一個 iterator 選項作為布林標誌(預設為 true)。這允許在下游流中“流式傳輸”拆分節點。當 iterator 模式設定為 true 時,每個節點在迭代時都會被轉換。當設定為 false 時,所有條目會首先被轉換,然後拆分節點才開始傳送到輸出通道。(您可以將這種差異理解為“轉換,傳送,轉換,傳送”與“轉換,轉換,傳送,傳送”)。有關更多資訊,請參閱 拆分器。