当最外层元素具有 xmlns 属性时,如何在camel中使用xpath?

Den*_* II 2 java xml xpath apache-camel

我在使用 xpath 使用 apache-camel 提取下面的“有效负载”值时遇到一些问题。我在两个示例 xml 的路由中使用以下 xpath,第一个示例 xml 按预期返回 SomeElement 和 SomeOtherElement,但第二个 xml 似乎根本无法解析 xml。

xpath("//Payload/*")
Run Code Online (Sandbox Code Playgroud)

这个示例 xml 解析得很好。

<Message>
  <Payload>
    <SomeElement />
    <SomeOtherElement />
  </Payload>
</Message>
Run Code Online (Sandbox Code Playgroud)

此示例 xml 不进行解析。

<Message xmlns="http://www.fake.com/Message/1">
  <Payload>
    <SomeElement />
    <SomeOtherElement />
  </Payload>
</Message>
Run Code Online (Sandbox Code Playgroud)

我发现了一个关于 xml 和 xpath 的类似问题,但它涉及 C# 并且不是骆驼解决方案。

知道如何使用 apache-camel 解决这个问题吗?

pth*_*tha 5

您的第二个示例 xml 指定了默认名称空间: xmlns="http://www.fake.com/Message/1",因此您的 xpath 表达式将不匹配,因为它没有指定名称空间。

有关如何指定命名空间的信息,请参阅http://camel.apache.org/xpath.html#XPath-Namespaces 。

你需要类似的东西

Namespaces ns = new Namespaces("fk", "http://www.fake.com/Message/1");

xpath("//fk:Payload/*", ns)
Run Code Online (Sandbox Code Playgroud)

我不熟悉 Apache-Camel,这只是一些快速谷歌搜索的结果。

另一种选择可能只是将您的 xPath 更改为类似的内容

xpath("//*[local-name()='Payload']/*)
Run Code Online (Sandbox Code Playgroud)

祝你好运。