132.14. 命名空间审计以帮助调试
用户经常面临的许多与 XPath 相关的问题与命名空间的使用相关联。您的消息中的命名空间之间可能存在一些对齐,以及您的 XPath 表达式了解或引用的命名空间之间。当因为命名空间问题而无法找到 XML 元素和属性的 XPath predicates 或 表达式可能像 它们无法正常工作 一样,实际上,它都缺少命名空间定义。
XML 中的命名空间是完全必要的,虽然我们希望通过自动将一些 magic 或 voodoo 到线命名空间来简化其使用情况,但实际上,任何操作都会与标准有关,并大大阻碍了互操作性。
因此,我们可以通过向 XPath Expression Language 添加两个新功能来帮助您调试此类问题,从而可从 predicates 和 表达式访问。
132.14.1. 记录 XPath expression/predicate 的 Namespace 上下文 复制链接链接已复制到粘贴板!
每次在内部池中创建新的 XPath 表达式时,Camel 将记录 org.apache.camel.language.xpath.XPathBuilder
日志记录器下的表达式的命名空间上下文。由于 Camel 以分级方式(父子关系)代表命名空间上下文,整个树都是以递归方式输出,且格式如下:
[me: {prefix -> namespace}, {prefix -> namespace}], [parent: [me: {prefix -> namespace}, {prefix -> namespace}], [parent: [me: {prefix -> namespace}]]]
[me: {prefix -> namespace}, {prefix -> namespace}], [parent: [me: {prefix -> namespace}, {prefix -> namespace}], [parent: [me: {prefix -> namespace}]]]
这些选项中的任何一个都可用于激活此日志记录:
-
在
org.apache.camel.language.xpath.XPathBuilder
日志记录器或一些父日志记录器(如org.apache.camel
或 root 日志记录器)上启用 TRACE 日志记录 -
按照以下部分所示启用
logNamespaces
选项,在这种情况下,日志记录将在 INFO 级别上发生
132.14.2. 审计命名空间 复制链接链接已复制到粘贴板!
Camel 可以在评估 XPath 表达式之前发现并转储每个传入消息上存在的所有命名空间,从而为您提供所需的所有丰富的信息,以帮助您分析和固定可能的命名空间问题。
为了达到此目的,它会在内部使用另一个定制的 XPath 表达式提取消息中显示的所有命名空间映射,显示每个映射的前缀和完整命名空间 URI。
需要考虑的一些点:
-
从输出中隐藏了隐式 XML 命名空间(
xmlns:xml="http://www.w3.org/XML/1998/namespace"
),因为它没有添加值 -
默认命名空间列在输出中的
DEFAULT
关键字下 - 请记住,命名空间可以在不同的范围下重新映射。考虑可分配不同命名空间或默认命名空间更改内部元素的顶级 'a' 前缀。对于每个发现的前缀,会列出所有关联的 URI。
您可以在 Java DSL 和 XML DSL 中启用这个选项:
Java DSL:
XPathBuilder.xpath("/foo:person/@id", String.class).logNamespaces()
XPathBuilder.xpath("/foo:person/@id", String.class).logNamespaces()
XML DSL:
<xpath logNamespaces="true" resultType="String">/foo:person/@id</xpath>
<xpath logNamespaces="true" resultType="String">/foo:person/@id</xpath>
审计的结果将出现在 org.apache.camel.language.xpath.XPathBuilder
日志记录器下的 INFO 级别,如下所示:
2012-01-16 13:23:45,878 [stSaxonWithFlag] INFO XPathBuilder - Namespaces discovered in message: {xmlns:a=[http://apache.org/camel], DEFAULT=[http://apache.org/default], xmlns:b=[http://apache.org/camelA, http://apache.org/camelB]}
2012-01-16 13:23:45,878 [stSaxonWithFlag] INFO XPathBuilder - Namespaces discovered in message:
{xmlns:a=[http://apache.org/camel], DEFAULT=[http://apache.org/default],
xmlns:b=[http://apache.org/camelA, http://apache.org/camelB]}