|
如需使用最新稳定版本,请使用 Spring Integration 7.0.4! |
拆分 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 开始,XPathMessageSplitter 会在请求 payload 不是类型 org.w3c.dom.Node 时,为 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 选项暴露为 boolean 标志(默认为 true)。
这允许在下游流程中对拆分节点进行“流式”处理。
当 iterator 模式设置为 true 时,每个节点在迭代过程中都会被转换。
当启用 false 时,所有条目会先被转换,然后拆分节点才开始发送到输出通道。
(您可以将这种差异理解为“转换、发送、转换、发送”与“转换、转换、发送、发送”之间的区别。)
有关更多信息,请参阅 Splitter。)