如需使用最新稳定版本,请使用 Spring Integration 7.0.4spring-doc.cadn.net.cn

命名空间支持

Spring Integration XML 模块内的所有组件都提供命名空间支持。 要启用命名空间支持,您需要导入 Spring Integration XML 模块的架构。 以下示例展示了一个典型的配置:spring-doc.cadn.net.cn

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:int="http://www.springframework.org/schema/integration"
  xmlns:int-xml="http://www.springframework.org/schema/integration/xml"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    https://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/integration
    https://www.springframework.org/schema/integration/spring-integration.xsd
    http://www.springframework.org/schema/integration/xml
    https://www.springframework.org/schema/integration/xml/spring-integration-xml.xsd">
</beans>

XPath 表达式

Spring Integration XML 模块中的许多组件都使用 XPath 表达式。 这些组件中的每一个要么引用已定义为顶层元素的 XPath 表达式,要么使用嵌套的 <xpath-expression/> 元素。spring-doc.cadn.net.cn

所有形式的 XPath 表达式都会创建一个使用 Spring org.springframework.xml.xpath.XPathExpressionFactoryXPathExpression。 创建 XPath 表达式时,将使用类路径上可用的最佳 XPath 实现(JAXP 1.3+ 或 Jaxen,优先选择 JAXP)。spring-doc.cadn.net.cn

内部而言,Spring Integration 使用 Spring Web Services 项目提供的 XPath 功能 (www.spring.io/spring-ws)。 具体来说,我们使用的是 Spring Web Services XML 模块 (spring-xml-x.x.x.jar)。 如需深入了解,请参阅 respective 文档:docs.spring.io/spring-ws/docs/current/reference/#xpath

这是 xpath-expression 元素所有可用配置参数的概述: 以下列表显示了 xpath-expression 元素的可用属性:spring-doc.cadn.net.cn

<int-xml:xpath-expression expression="" (1)
          id=""                         (2)
          namespace-map=""              (3)
          ns-prefix=""                  (4)
          ns-uri="">                    (5)
    <map></map>                         (6)
</int-xml:xpath-expression>
1 定义 XPath 表达式。 必填。
2 底层 bean 定义的标识符。 它是 org.springframework.xml.xpath.XPathExpression 的实例。 可选。
3 对包含命名空间的映射的引用。 映射的键定义命名空间前缀,映射的值设置命名空间 URI。 同时指定此属性与 map 元素或 ns-prefixns-uri 属性是无效的。 可选。
4 允许您直接将命名空间前缀作为 XPath 表达式元素的属性进行设置。 如果您设置了 ns-prefix,还必须同时设置 ns-uri 属性。 可选。
5 允许您直接将命名空间 URI 作为 XPath 表达式元素的属性进行设置。 如果您设置了 ns-uri,则还必须设置 ns-prefix 属性。 可选。
6 定义一个包含命名空间的映射。 只允许有一个 map 子元素。 映射的键定义命名空间前缀,映射的值设置命名空间 URI。 同时指定此元素和 map 属性,或同时设置 ns-prefixns-uri 属性是无效的。 可选。

为 XPath 表达式提供命名空间(可选)

对于 XPath 表达式元素,您可以将命名空间信息作为配置参数提供。 您可以通过以下任一方式定义命名空间:spring-doc.cadn.net.cn

这三个选项是互斥的。 只能设置其中一个选项。spring-doc.cadn.net.cn

以下示例展示了使用 XPath 表达式的几种不同方式,包括之前提到的设置 XML 命名空间的选项:mentioned earlier:spring-doc.cadn.net.cn

<int-xml:xpath-filter id="filterReferencingXPathExpression"
                      xpath-expression-ref="refToXpathExpression"/>

<int-xml:xpath-expression id="refToXpathExpression" expression="/name"/>

<int-xml:xpath-filter id="filterWithoutNamespace">
    <int-xml:xpath-expression expression="/name"/>
</int-xml:xpath-filter>

<int-xml:xpath-filter id="filterWithOneNamespace">
    <int-xml:xpath-expression expression="/ns1:name"
                              ns-prefix="ns1" ns-uri="www.example.org"/>
</int-xml:xpath-filter>

<int-xml:xpath-filter id="filterWithTwoNamespaces">
    <int-xml:xpath-expression expression="/ns1:name/ns2:type">
        <map>
            <entry key="ns1" value="www.example.org/one"/>
            <entry key="ns2" value="www.example.org/two"/>
        </map>
    </int-xml:xpath-expression>
</int-xml:xpath-filter>

<int-xml:xpath-filter id="filterWithNamespaceMapReference">
    <int-xml:xpath-expression expression="/ns1:name/ns2:type"
                              namespace-map="defaultNamespaces"/>
</int-xml:xpath-filter>

<util:map id="defaultNamespaces">
    <util:entry key="ns1" value="www.example.org/one"/>
    <util:entry key="ns2" value="www.example.org/two"/>
</util:map>

使用默认命名空间进行 XPath 表达式

在使用默认命名空间时,您可能会遇到与预期行为不同的情况。 假设我们有以下 XML 文档(表示两本书的订单):spring-doc.cadn.net.cn

<?xml version="1.0" encoding="UTF-8"?>
<order>
    <orderItem>
        <isbn>0321200683</isbn>
        <quantity>2</quantity>
    </orderItem>
    <orderItem>
        <isbn>1590596439</isbn>
        <quantity>1</quantity>
    </orderItem>
</order>

本文档未声明命名空间。 因此,应用以下 XPath 表达式可按预期工作:spring-doc.cadn.net.cn

<int-xml:xpath-expression expression="/order/orderItem" />

您可能期望相同的表达式也适用于以下 XML 文件:spring-doc.cadn.net.cn

<?xml version="1.0" encoding="UTF-8"?>
<order xmlns="http://www.example.org/orders">
	<orderItem>
		<isbn>0321200683</isbn>
		<quantity>2</quantity>
	</orderItem>
	<orderItem>
		<isbn>1590596439</isbn>
		<quantity>1</quantity>
	</orderItem>
</order>

前面的示例与上一个示例完全相同,但声明了一个默认命名空间。spring-doc.cadn.net.cn

然而,前一个 XPath 表达式 (/order/orderItem) 在这种情况下会失败。spring-doc.cadn.net.cn

为了解决此问题,您必须通过设置 ns-prefixns-uri 属性或设置 namespace-map 属性来提供命名空间前缀和命名空间 URI。 命名空间 URI 必须与您 XML 文档中声明的命名空间相匹配。 在前面的示例中,该值为 www.example.org/ordersspring-doc.cadn.net.cn

不过,您可以任意选择命名空间前缀。 事实上,提供空字符串也是有效的。 (但 null 是不允许的。) 对于由空字符串组成的命名空间前缀,您的 XPath 表达式必须使用冒号(":")来表示默认命名空间。 如果省略冒号,XPath 表达式将无法匹配。 以下 XPath 表达式可与 preceding example 中的 XML 文档进行匹配:spring-doc.cadn.net.cn

<int-xml:xpath-expression expression="/:order/:orderItem"
    ns-prefix="" ns-uri="https://www.example.org/prodcuts"/>

您也可以提供任何其他任意选择的命名空间前缀。 以下 XPath 表达式(使用了 myorder 命名空间前缀)也匹配:spring-doc.cadn.net.cn

<int-xml:xpath-expression expression="/myorder:order/myorder:orderItem"
    ns-prefix="myorder" ns-uri="https://www.example.org/prodcuts"/>

命名空间 URI 是真正重要的信息,而非前缀。 Jaxen 对此总结得非常到位:spring-doc.cadn.net.cn

在 XPath 1.0 中,所有无前缀的名称都是非限定名。 XPath 表达式中使用的命名空间前缀不必与要查询的文档中使用的命名空间前缀相同。 只需要命名空间 URI 匹配,而不需要前缀匹配。