对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

在消息转换方面,XPath 是转换具有 XML 有效负载的消息的好方法。 为此,可以使用该元素定义 XPath 转换器。<xpath-transformer/>Spring中文文档

简单的 XPath 转换

请考虑以下变压器配置:Spring中文文档

<int-xml:xpath-transformer input-channel="inputChannel" output-channel="outputChannel"
      xpath-expression="/person/@name" />

还要考虑以下几点:MessageSpring中文文档

Message<?> message =
  MessageBuilder.withPayload("<person name='John Doe' age='42' married='true'/>").build();

将此消息发送到“inputChannel”后,前面配置的 XPath 转换器会将此 XML 消息转换为有效负载为“John Doe”的简单消息,所有这些都基于属性中指定的简单 XPath 表达式。Messagexpath-expressionSpring中文文档

XPath 还允许您将提取的元素简单转换为所需的类型。 有效的返回类型在接口中定义并遵循接口指定的转换规则。javax.xml.xpath.XPathConstantsjavax.xml.xpath.XPathSpring中文文档

以下常量由类定义:、、、和。XPathConstantsBOOLEANDOM_OBJECT_MODELNODENODESETNUMBERSTRINGSpring中文文档

可以使用元素的属性配置所需的类型,如以下示例所示(两次):evaluation-type<xpath-transformer/>Spring中文文档

<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.NodeMapperXPathOperationsNodeNodeMappernode-mapperSpring中文文档

<int-xml:xpath-transformer input-channel="nodeMapperInput" xpath-expression="/person/@age"
                           node-mapper="testNodeMapper" output-channel="output"/>

下面的示例演示了与上述示例一起使用的实现:NodeMapperSpring中文文档

class TestNodeMapper implements NodeMapper {
  public Object mapNode(Node node, int nodeNum) throws DOMException {
    return node.getTextContent() + "-mapped";
  }
}

XML 有效负载转换器

您还可以使用 的实现来提供更精细的转换。 以下示例演示如何定义一个:org.springframework.integration.xml.XmlPayloadConverterSpring中文文档

<int-xml:xpath-transformer input-channel="customConverterInput"
                           output-channel="output" xpath-expression="/test/@type"
                           converter="testXmlPayloadConverter" />

下面的示例演示了与上述示例一起使用的实现:XmlPayloadConverterSpring中文文档

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();
  }
}

如果未提供此参考,则使用 。 在大多数情况下,它应该足够了,因为它可以从 、 、 、 、 和 有效负载进行转换。 如果您需要扩展到该默认实现的功能之外,那么上游可能是比在此处提供对此策略的自定义实现的引用更好的选择。DefaultXmlPayloadConverterNodeDocumentSourceFileStringInputStreambyte[]TransformerSpring中文文档