如何在Apache Camel中用XPath从XML提取根标签属性值
用Camel XPath提取XML根标签属性值(无命名空间)
没问题,用Camel XPath来搞定这个需求超简单,不用管命名空间的话步骤更直接,我给你拆解清楚:
1. 核心XPath表达式
首先你需要的XPath逻辑很直观:
/*匹配XML文档的根节点(不管根标签叫什么名字,比如你的示例里的<rootTag>)/@attribute1取这个根节点上名为attribute1的属性值
所以完整的表达式就是:/*/@attribute1
2. Java DSL路由实现
在Java风格的Camel路由里,你可以直接用xpath()方法提取属性值,比如把结果存到消息头里方便后续处理:
from("direct:extractRootAttribute") // 提取属性值并放到名为extractedAttr的消息头中 .setHeader("extractedAttr", xpath("/*/@attribute1", String.class)) // 打印提取结果验证 .log("提取到的根标签属性值: ${header.extractedAttr}");
这里String.class指定返回结果的类型,避免默认的Object类型,方便后续使用。
3. XML DSL路由实现
如果是用XML配置的Camel路由,写法也很清晰:
<route> <from uri="direct:extractRootAttribute"/> <setHeader headerName="extractedAttr"> <!-- resultType指定返回字符串类型 --> <xpath resultType="java.lang.String">/*/@attribute1</xpath> </setHeader> <log message="提取到的根标签属性值: ${header.extractedAttr}"/> </route>
4. 处理器中手动调用XPathBuilder
如果需要更灵活的处理(比如先做一些XML预处理),可以在Processor里用XPathBuilder来提取:
from("direct:extractRootAttribute") .process(exchange -> { // 从Exchange Body中获取XML字符串 String xmlContent = exchange.getIn().getBody(String.class); // 执行XPath提取 String attrValue = XPathBuilder.xpath("/*/@attribute1") .evaluate(exchange.getContext(), xmlContent, String.class); // 把结果存回Exchange exchange.getIn().setHeader("extractedAttr", attrValue); }) .log("提取到的根标签属性值: ${header.extractedAttr}");
关键注意点
因为你不需要处理命名空间,所以完全不用配置NamespaceContext,直接用上面的XPath表达式就可以正常工作,不用额外做任何命名空间相关的设置。
内容的提问来源于stack exchange,提问作者Susanna M
相关产品推荐
相关产品推荐

