对于最新的稳定版本,请使用 Spring Integration 6.4.0! |
使用 XPath 转换 XML 消息
在消息转换方面,XPath 是转换具有 XML 有效负载的消息的好方法。
您可以通过使用 element 定义 XPath 转换器来实现此目的。<xpath-transformer/>
简单的 XPath 转换
请考虑以下转换器配置:
<int-xml:xpath-transformer input-channel="inputChannel" output-channel="outputChannel"
xpath-expression="/person/@name" />
另请考虑以下几点:Message
Message<?> message =
MessageBuilder.withPayload("<person name='John Doe' age='42' married='true'/>").build();
将此消息发送到 'inputChannel' 后,之前配置的 XPath 转换器将此 XML 消息转换为有效负载为 'John Doe' 的简单消息,所有这些都基于属性中指定的简单 XPath 表达式。Message
xpath-expression
XPath 还允许您将提取的元素简单转换为所需的类型。
有效的返回类型在接口指定的转换规则中定义并遵循这些规则。javax.xml.xpath.XPathConstants
javax.xml.xpath.XPath
以下常量由类定义: 、 、 、 、 和 。XPathConstants
BOOLEAN
DOM_OBJECT_MODEL
NODE
NODESET
NUMBER
STRING
您可以使用 element 的属性来配置所需的类型,如下例所示(两次):evaluation-type
<xpath-transformer/>
<int-xml:xpath-transformer input-channel="numberInput" xpath-expression="/person/@age"
evaluation-type="NUMBER_RESULT" output-channel="output"/>
<int-xml:xpath-transformer input-channel="booleanInput"
xpath-expression="/person/@married = 'true'"
evaluation-type="BOOLEAN_RESULT" output-channel="output"/>
节点映射器
如果需要为 XPath 表达式提取的节点提供自定义映射,则可以提供对 (实现用于基于每个节点映射对象的接口)的实现的引用。
要提供对 的引用 ,可以使用 该属性,如下例所示:org.springframework.xml.xpath.NodeMapper
XPathOperations
Node
NodeMapper
node-mapper
<int-xml:xpath-transformer input-channel="nodeMapperInput" xpath-expression="/person/@age"
node-mapper="testNodeMapper" output-channel="output"/>
以下示例显示了与上述示例配合使用的实现:NodeMapper
class TestNodeMapper implements NodeMapper {
public Object mapNode(Node node, int nodeNum) throws DOMException {
return node.getTextContent() + "-mapped";
}
}
XML 负载转换器
您还可以使用 的实现来提供更精细的转换。
以下示例演示如何定义一个:org.springframework.integration.xml.XmlPayloadConverter
<int-xml:xpath-transformer input-channel="customConverterInput"
output-channel="output" xpath-expression="/test/@type"
converter="testXmlPayloadConverter" />
以下示例显示了与上述示例配合使用的实现:XmlPayloadConverter
class TestXmlPayloadConverter implements XmlPayloadConverter {
public Source convertToSource(Object object) {
throw new UnsupportedOperationException();
}
//
public Node convertToNode(Object object) {
try {
return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(
new InputSource(new StringReader("<test type='custom'/>")));
}
catch (Exception e) {
throw new IllegalStateException(e);
}
}
//
public Document convertToDocument(Object object) {
throw new UnsupportedOperationException();
}
}
如果您未提供此引用,则使用 the。
在大多数情况下,它应该就足够了,因为它可以从 、 和 payload 转换。
如果您需要扩展该默认实现的功能之外,则 upstream 可能比在此处提供对此策略的自定义实现的引用更好。DefaultXmlPayloadConverter
Node
Document
Source
File
String
InputStream
byte[]
Transformer