使用 XPath 轉換 XML 訊息

在訊息轉換方面,XPath 是轉換具有 XML 負載的訊息的絕佳方式。您可以透過定義帶有 <xpath-transformer/> 元素的 XPath 轉換器來實現。

簡單 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 表示式。

XPath 還允許您將提取的元素簡單地轉換為所需的型別。有效的返回型別在 javax.xml.xpath.XPathConstants 中定義,並遵循 javax.xml.xpath.XPath 介面指定的轉換規則。

XPathConstants 類定義了以下常量:BOOLEANDOM_OBJECT_MODELNODENODESETNUMBERSTRING

您可以使用 <xpath-transformer/> 元素的 evaluation-type 屬性配置所需的型別,如下面的示例所示(兩次)

<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。在大多數情況下,它應該足夠了,因為它可以從 NodeDocumentSourceFileStringInputStreambyte[] 負載進行轉換。如果您需要擴充套件該預設實現的功能,那麼上游的 Transformer 可能比在此處提供自定義實現的引用更好的選擇。

© . This site is unofficial and not affiliated with VMware.