【问题标题】:XPath expression to filter incoming XML Documents用于过滤传入 XML 文档的 XPath 表达式
【发布时间】:2014-12-10 18:07:35
【问题描述】:

我正在尝试使用“选择”来根据部分内容来引导 XML 文档。但由于我是 mule 新手,我正在努力理解如何让 xpath 表达式解析传入的消息。

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

每个选项的“何时”设置为

#[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 对象来提取信息并将其放入注册表中。这也奏效了。

请注意,如果不点击“多个 JAXB 上下文”,我们将无法使用 getPayloadAsString()。不要问我为什么 mule 需要 JAXB 上下文来将输入流转换为字符串。因此,我们在流程中放置了一个Bytearray to String 转换器:

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

【问题讨论】:

    标签: xpath mule


    【解决方案1】:

    MULE documentation 显示如下示例:

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

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

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

    【讨论】:

    • ... 以及许多其他排列。似乎 mule 的输出具有误导性,并且日志说的有些不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    相关资源
    最近更新 更多