You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Camel 2.x迁移至4.x:Namespaces类替换方案咨询

替代Camel 2.x中org.apache.camel.builder.xml.Namespaces的方案(Camel 4.x)

Camel 3.x及后续版本移除了Namespaces类,替代核心思路是直接在XML相关处理器(如XPath、XQuery、XSLT等)中通过命名空间映射配置来处理XML命名空间,以下是具体实现方式:

1. Java DSL:XPath表达式中直接配置命名空间

针对单个XPath表达式,直接通过namespace()方法逐个添加前缀与URI的映射,替代原Namespaces类的用法:

// Camel 2.x 旧写法
Namespaces ns = new Namespaces("soap", "http://schemas.xmlsoap.org/soap/envelope/");
from("direct:start")
    .setBody(xpath("/soap:Envelope/soap:Body/ns:Request", ns));

// Camel 4.x 替代写法
from("direct:start")
    .setBody(xpath("/soap:Envelope/soap:Body/ns:Request")
        .namespace("soap", "http://schemas.xmlsoap.org/soap/envelope/")
        .namespace("ns", "http://your-custom-namespace/"));

2. Java DSL:复用命名空间映射(多处理器共享)

如果多个XML处理器需要使用相同的命名空间,可提前定义Map存储映射关系,再通过namespaces()方法批量引用:

Map<String, String> nsMap = new HashMap<>();
nsMap.put("soap", "http://schemas.xmlsoap.org/soap/envelope/");
nsMap.put("ns", "http://your-custom-namespace/");

from("direct:start")
    .setBody(xpath("/soap:Envelope/soap:Body/ns:Request").namespaces(nsMap))
    .to("direct:process")
    .filter(xpath("/ns:Response/ns:Status = 'SUCCESS'").namespaces(nsMap))
    .to("direct:success");

3. XML DSL:两种命名空间配置方式

方式一:在表达式内定义

直接在<xpath>标签下通过<namespace>子标签配置:

<route>
    <from uri="direct:start"/>
    <setBody>
        <xpath expression="/soap:Envelope/soap:Body/ns:Request">
            <namespace prefix="soap" uri="http://schemas.xmlsoap.org/soap/envelope/"/>
            <namespace prefix="ns" uri="http://your-custom-namespace/"/>
        </xpath>
    </setBody>
</route>

方式二:全局命名空间复用

在<camelContext>标签中声明全局命名空间,后续表达式可直接使用前缀:

<camelContext xmlns="http://camel.apache.org/schema/spring"
              xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
              xmlns:ns="http://your-custom-namespace/">
    <route>
        <from uri="direct:start"/>
        <setBody>
            <xpath>/soap:Envelope/soap:Body/ns:Request</xpath>
        </setBody>
    </route>
</camelContext>

额外说明

  • 所有XML相关的表达式处理器(XPath、XQuery、XSLT等)均支持上述命名空间配置逻辑,无需依赖旧的Namespaces类。
  • 若使用XSLT组件,命名空间可直接在XSLT文件中定义,路由层面无需额外配置。

内容的提问来源于stack exchange,提问作者chrisdde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:34:57