使用 XPath 转换 XML 消息
在消息转换方面,XPath 是转换具有 XML 有效负载的消息的好方法。
为此,您可以使用<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 消息转换为简单的Message负载为“John Doe”,所有这些都基于xpath-expression属性。
XPath 还允许您将提取的元素简单转换为所需的类型。
有效的返回类型在javax.xml.xpath.XPathConstants并遵循javax.xml.xpath.XPath接口。
以下常量由XPathConstants类:BOOLEAN,DOM_OBJECT_MODEL,NODE,NODESET,NUMBER和STRING.
您可以使用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();
  }
}如果您未提供此引用,则DefaultXmlPayloadConverter被使用。
在大多数情况下,它应该足够了,因为它可以从Node,Document,Source,File,String,InputStream和byte[]负载。
如果您需要扩展该默认实现的功能之外,则 upstreamTransformer可能比在此处提供对此策略的自定义实现的引用更好。