分割 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 版開始,當請求酬載的類型不是 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>
從 version 4.2
開始,XPathMessageSplitter
公開一個 iterator
選項作為布林旗標(預設為 true
)。這允許在下游流程中「串流」分割節點。在 iterator
模式設定為 true
的情況下,每個節點都會在迭代時轉換。當為 false
時,所有項目會先轉換,然後分割節點才開始傳送到輸出通道。(您可以將差異視為「轉換、傳送、轉換、傳送」與「轉換、轉換、傳送、傳送」。)如需更多資訊,請參閱 分割器。