如何在Camel中使用XPath提取存储于Header中的XML数据?
嘿,我来帮你搞定在Apache Camel里用XPath提取Header中XML数据的事儿!假设你的XML已经存在名为xmlData的Camel Header里(要是你的Header key不是这个,换成你实际用的就行哈),下面分不同场景给你具体示例:
在Apache Camel中使用XPath提取Header里的XML数据
1. 提取单个简单节点值
比如要抓第一个<library>的名称,或者第一本<book>的标题,直接用XPath定位就行:
Java DSL 写法
from("direct:start") // 提取图书馆名称 .setHeader("libraryName", xpath("/list/library/name/text()", String.class).header("xmlData")) // 提取第一本书的标题 .setHeader("firstBookTitle", xpath("/list/book[1]/title/text()", String.class).header("xmlData")) .to("log:output");
这里.header("xmlData")是关键,告诉Camel从指定Header里读取XML,而不是默认的Body;text()用来获取节点的纯文本内容,第二个参数指定返回值类型。
XML DSL 写法
<route> <from uri="direct:start"/> <setHeader headerName="libraryName"> <xpath resultType="java.lang.String" source="header:xmlData">/list/library/name/text()</xpath> </setHeader> <setHeader headerName="firstBookTitle"> <xpath resultType="java.lang.String" source="header:xmlData">/list/book[1]/title/text()</xpath> </setHeader> <to uri="log:output"/> </route>
2. 提取嵌套节点内容
比如要拿图书馆地址的第一行,或者第一本书的作者名字:
// 提取图书馆地址第一行 .setHeader("libAddressLine1", xpath("/list/library/address/line1/text()", String.class).header("xmlData")) // 提取第一本书的作者姓名 .setHeader("firstBookAuthor", xpath("/list/book[1]/author/name/text()", String.class).header("xmlData"))
3. 提取多个节点(比如所有书籍的ISBN)
如果要把所有<book>的<isbn>都捞出来,可以指定返回类型为List,Camel会自动把匹配到的所有值装进列表里:
.setHeader("allBookIsbns", xpath("/list/book/isbn/text()", List.class).header("xmlData"))
4. 必看注意事项
- 命名空间处理:如果你的XML带命名空间,得先声明再用,比如:
Namespace ns = new Namespace("lib", "http://your-library-namespace.com"); .setHeader("libraryName", xpath("/lib:list/lib:library/lib:name/text()", String.class) .namespaces(ns) .header("xmlData")) - 类型匹配:根据你要的数据类型指定正确的
resultType,比如数字类型用Integer.class,布尔值用Boolean.class,Camel会自动做类型转换。 - 调试技巧:可以用
log组件输出Header内容验证结果:
这样就能在日志里看到所有提取后的Header值,确认XPath是否生效。.to("log:com.example?showHeaders=true")
内容的提问来源于stack exchange,提问作者shearne
相关产品推荐
相关产品推荐

