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
相关产品推荐
相关产品推荐

