给定一个Camel路由,该路由应该提取XML消息的一些内部部分,从中创建一条新消息然后传递它 .
from(SUB_EXTRACT_XML)
.setExchangePattern(ExchangePattern.InOut)
.setBody().xpath("//mmsg:MyMessage/mmsg:AnyPayload/*", namespaces)
.setBody().simple("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n${in.body}")
.to(...)
对于像这样的正确输入消息(“嵌入式”xml消息在模式中由xs:any定义),它正在工作,因为消息是我期望的:
<mmsg:MyMessage>
<mmsg:RandomTags/>
...
<mmsg:AnyPayload> <!-- xs:any in xsd -->
<some><xml/><here/></some>
</mmsg:AnyPayload>
</mmsg:MyMessage>
鉴于XML消息存在一些问题,例如缺少mmsg:AnyPayload标记,因此XPATH无法完成其工作:
<mmsg:MyMessage>
<mmsg:RandomTags/>
...
<some><xml/><here/></some>
</mmsg:MyMessage>
XPATH将无法提取数据,并且传递了整个XML消息(包括mmsg:MyMessage),这不是预期的 . 我宁愿在这个阶段抛出一些例外 .
Question:
有没有办法检查xpath表达式是否实际上找到了稍后在路由中引用的元素,或者它是否未能提取给定的元素?
我知道我之前可以对消息进行一些模式验证并拒绝垃圾邮件,但有没有办法查看XPath表达式是否失败?
1 回答
解决方案是在路由中使用
choice()
DSL,如下所示:第二条路线就是为了表明你可以使用第一条路线中设置的 Headers (以及正文) .