Apache Camel 处理 XML 消息的核心是串联“来源→判断→拆解→改写→投递”环节,支持 XPath 路由、splitter 拆分聚合、JAXB/XSLT/XMLJSON 转换,并可与 FTP/JMS 等端点无缝集成。

Apache Camel 路由和转换 XML 消息,核心在于把“消息从哪来、怎么判断、如何拆解、怎样改写、发到哪去”这几个环节串起来。它不强制你用某一种方式,而是提供灵活的组件组合——比如用 from 接入 XML 源,用 split/xpath 拆结构,用 jaxb/xslt 做格式转换,再用 to 发送到目标端点。
XML 消息的路由:按内容或结构分发
Camel 支持基于 XML 内容做条件路由,常用的是 XPath 表达式配合 choice() 或 filter():
- 用
xpath("//order/@priority = 'high'")判断是否高优先级订单,走快速通道; - 用
xpath("count(//item) > 10")统计商品数量,超量订单转人工审核; - 用
filter(xpath("//status = 'draft'"))只让草稿状态的消息继续流转,其他直接丢弃。
这类路由完全解耦业务逻辑与传输协议——无论 XML 来自 FTP、HTTP 还是 ActiveMQ,只要能解析,就能统一处理。
XML 消息的拆分与聚合
当一个 XML 文件包含多个业务单元(如一份订单含多个子项),可用 splitter 拆成独立消息分别处理:
-
split(xpath("//order/items/item"))提取每个元素作为一条新消息; - 拆分后可并行调用校验服务、库存查询等,再用
aggregate()按订单 ID 合并结果; - 注意默认是浅拷贝,若需修改每条子消息的 header 或 body,应加
onPrepare(...)创建深拷贝。
XML 格式转换:对象 ↔ XML ↔ JSON
Camel 提供多套成熟方案适配不同转换场景:
-
JAXB:适合有固定 XSD 的 XML,自动绑定 Java 类,用
marshal().jaxb(MyOrder.class)或unmarshal().jaxb(); -
XSLT:做结构重排或字段映射,比如把旧版订单 XML 映射为新版字段名,只需配置
transform().xslt("order-v1-to-v2.xsl"); -
XMLJSON:轻量级互转,适合对外提供 REST 接口时,用
transform().xmljson()把入参 XML 转成 JSON 交给下游微服务。
常见端点搭配示例
真实流程中,XML 处理常嵌在完整链路里。例如从 FTP 下载 XML 订单,校验后转成 JMS 消息:
-
from("ftp://host/orders?username=u&password=p&fileName=*.xml")—— 拉取文件; -
.split(xpath("//order")).filter(xpath("@valid='true'"))—— 拆单+过滤; -
.unmarshal().jaxb(Order.class).process(new ValidateProcessor())—— 解析+校验; -
.marshal().json(JsonLibrary.Jackson).to("jms:queue:processedOrders")—— 转 JSON 并投递。
整个过程无需手写 XML 解析器,也不用管理连接池或事务边界,Camel 自动协调生命周期与错误恢复。











