拆分 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
时,会首先转换所有条目,然后才开始将拆分节点发送到输出通道。(您可以将差异理解为“转换,发送,转换,发送”与“转换,转换,发送,发送”。)有关更多信息,请参阅 拆分器。