90.13. デバッグを支援する名前空間の監査
ユーザーが頻繁に直面するXPath 関連の問題の多くは、名前空間の使用に関連しまs.メッセージに存在する名前空間と、XPath 式が認識または参照している名前空間との間に、多少のずれがある場合があります。XPath の述語または式において、名前空間の問題が原因で XML 要素と属性を見つけることができない場合は、実際には名前空間の定義が不足しているだけにも関わらず、機能していない ように見える場合があります。
XML の名前空間は必ず必要で、ある操作を実装して名前空間を自動的に接続することで使用方法を簡素化することができるといいのですが、実際は、このような道筋をたどったアクションは、標準に反してしまい、相互運用性が確保しにくくなります。
したがって、XPath 式言語に 2 つの新機能を追加して、述語と式の両方からアクセスできるようして、このような問題のデバッグを支援することがこちらで最大限提供できる内容です。
90.13.1. XPath 式/述語の名前空間コンテキストのログ記録 リンクのコピーリンクがクリップボードにコピーされました!
内部プールで新しい XPath 式が作成されるたびに、Camel は式の名前空間コンテキストを org.apache.camel.language.xpath.XPathBuilder ロガーに記録します。Camel は Namespace Context を階層的な方法 (親子関係) で表すため、ツリー全体が次の形式で再帰的に出力されます。
[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やルートロガーなどの親ロガーで TRACE ロギングを有効にします。 -
次のセクションで示すように、
logNamespacesオプションを有効にします。この場合、ログは INFO レベルで行われます。
90.13.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]}