用于过滤传入XML文档的XPath表达式

时间:2014-12-08 15:49:43

标签: xpath mule

我试图使用" Choice"根据部分内容引导XML文档。但是,由于我是骡子的新手,我要了解如何获取xpath表达式来解析传入的消息。

作为SSCCE,我设置了这个流程:

simple flow with choice between two logs

"当"每个选项都设置为

#[xpath('//foo/bar').text] == baz

#[xpath('//foo/bar').text] != baz` 

分别

无所谓我似乎尝试过;它总是回应客户:

Execution of the expression "xpath('//foo/bar').text] == baz" failed. (org.mule.api.expression.ExpressionRuntimeException). Message payload is of type: ContentLengthInputStream

我是否需要先将输入转换为某些内容?如果是那么什么?或者还有什么我应该做的才能使这项工作?

<小时/> 的修改

检查了日志后,似乎错误与this相同。 JAXB上下文的多个实例。我找到了两种方法来解决这个问题。

一个是重构我们所有的代码只有一个JAXB 的实例(不容易,不是优选但它确实解决了问题)。

另一种是在EML中停止使用XPATH。相反,我创建了一个Java转换器,它手动使用Java Document Builder和XPATH对象来提取信息并将其放在注册表中。这也有效。

请注意,我们无法使用getPayloadAsString()而无法点击&#34;多个JAXB上下文&#34;。不要问我为什么mule需要一个JAXB上下文来将输入流转换为字符串。所以我们在流程中放置了一个Bytearray to String变换器:

enter image description here

当有多个JAXB上下文时,如果有人在eml中使用xpath有任何好方法,请随时留下答案

1 个答案:

答案 0 :(得分:0)

MULE documentation显示如下示例:

<when expression="#[payload.getPurchaseType() == 'book']">

其中比较运算符及其第二个操作数都在#[...]内。你试过吗? E.g。

<when expression="#[xpath('//foo/bar').text == 'baz']">