拆分 XML 訊息
XPathMessageSplitter
支援 payload 為 String
或 Document
的訊息。拆分器使用提供的 XPath 表示式將 payload 拆分成多個節點。預設情況下,每個 Node
例項會成為新訊息的 payload。當每個訊息都應該是 Document
時,可以設定 createDocuments
標誌。當傳入 String
payload 時,payload 會被轉換,然後拆分,再轉換回多個 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
會暴露 outputProperties
(例如 OutputKeys.OMIT_XML_DECLARATION
)屬性,用於 javax.xml.transform.Transformer
例項。以下示例定義了一個屬性,並將其與 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
時,會首先轉換所有條目,然後才開始將拆分節點發送到輸出通道。(您可以將差異理解為“轉換,傳送,轉換,傳送”與“轉換,轉換,傳送,傳送”。)有關更多資訊,請參閱 拆分器。