如何在Apache Camel中用XPath获取NodeList及指定XML子节点
Apache Camel XPath 问题解决方案
嘿,我来帮你搞定这两个Apache Camel里的XPath使用问题:
1. 如何在Apache Camel中使用XPath获取NodeList?
在Camel里获取NodeList其实很直接,核心是指定XPath表达式的返回类型,让Camel帮你把结果转换成org.w3c.dom.NodeList类型。
Java DSL 示例
import org.w3c.dom.NodeList; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.util.CamelHelper; public class XPathRoute extends RouteBuilder { @Override public void configure() throws Exception { from("direct:fetchNodes") // 用xpath()方法指定表达式和返回类型 .setBody(xpath("/Response/*", NodeList.class)) .process(exchange -> { NodeList nodeList = exchange.getIn().getBody(NodeList.class); // 遍历NodeList处理每个子节点 for (int i = 0; i < nodeList.getLength(); i++) { Node childNode = nodeList.item(i); // 可选:把节点转成字符串输出 String nodeXml = CamelHelper.convertToType(exchange, String.class, childNode); System.out.println("子节点XML:" + nodeXml); } }); } }
XML DSL 示例
如果用XML配置路由,需要在<xpath>标签里指定resultType属性:
<route> <from uri="direct:fetchNodes"/> <setBody> <xpath resultType="org.w3c.dom.NodeList">/Response/*</xpath> </setBody> <!-- 自定义Processor处理NodeList --> <process ref="nodeListProcessor"/> </route>
2. 提取Response下所有带标签的子节点
针对你给出的XML:
<Response> <Status> <Code>0</Code> </Status> <Order> <OrderId>1</OrderId> </Order> </Response>
问题原因分析
- 用
/Response会选中整个Response根节点,所以返回完整XML; - 用
/Response/text()返回空是因为Response的直接子节点是<Status>和<Order>,没有直接的文本内容,自然拿不到结果。
可行方案
要获取Response下所有带外层标签的子节点,直接用XPath表达式 /Response/* 即可,它会选中Response的所有直接子元素。
如果要直接返回拼接后的XML字符串
XML DSL写法:
<setBody> <xpath resultType="java.lang.String">/Response/*</xpath> </setBody>
执行后返回的内容就是:
<Status><Code>0</Code></Status><Order><OrderId>1</OrderId></Order>
如果要单独处理每个子节点
就用前面提到的返回NodeList的方式,遍历每个节点做自定义处理。
内容的提问来源于stack exchange,提问作者keanu
相关产品推荐
相关产品推荐

