该版本仍在开发中,尚未被视为稳定。对于最新的稳定版本,请使用 Spring Integration 7.0.0spring-doc.cadn.net.cn

用XPath转换XML消息

在消息转换方面,XPath 是转换带有 XML 负载的消息的绝佳方式。 你可以通过定义XPath变换器来实现<xpath-transformer/>元素。spring-doc.cadn.net.cn

简单XPath变换

考虑以下转换器配置:spring-doc.cadn.net.cn

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

还要考虑以下几点消息:spring-doc.cadn.net.cn

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

在将该消息发送到“inputChannel”后,XPath 变换器提前配置后,将该 XML 消息转换为简单的消息有效载荷为“John Doe”,全部基于 XPath 表达式中指定的简单xpath表达式属性。spring-doc.cadn.net.cn

XPath还允许你简单地将提取的元素转换为所需类型。 有效的返回类型定义于javax.xml.xpath.XPath常量并遵循以下条件的转换规则javax.xml.xpath.XPath接口。spring-doc.cadn.net.cn

以下常数由XPath常量类:布尔,DOM_OBJECT_MODEL,节点,节点集,字符串.spring-doc.cadn.net.cn

你可以通过使用评估型属性<xpath-transformer/>元素,如下例所示(两次):spring-doc.cadn.net.cn

<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(十字架运营)映射实现节点每个节点的对象)。 提供一个参考节点映射器,你可以使用节点映射器属性,如下例所示:spring-doc.cadn.net.cn

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

以下示例展示了一个节点映射器适用于上述示例的实现:spring-doc.cadn.net.cn

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

XML 有效载荷转换器

你也可以使用以下实现org.springframework.integration.xml.XmlPayloadConverter以提供更细致的变换。 以下示例展示了如何定义一个:spring-doc.cadn.net.cn

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

以下示例展示了一个XmlPayloadConverter适用于上述示例的实现:spring-doc.cadn.net.cn

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

如果您不提供此推荐信,DefaultXmlPayloadConverter被使用。 在大多数情况下它应该足够了,因为它可以从节点,公文,,文件,字符串,输入流字节[]负载。 如果你需要超越默认实现的能力,上游转换器这可能比在这里提供该策略的自定义实现参考更为合适。spring-doc.cadn.net.cn