1

Xerces 2.9.1 を使用して XML 解析を実行しています。XML には名前空間が含まれており、名前空間を認識するように Xerces を構成しました。

reccomの 2 つのプレフィックスが定義されています。rec はルート タグで定義され、comはそれを使用する各ノードで宣言されます。

<rec:root xmlns:rec="...">
   <rec:dummy ...>
      <com:item xmlns:com="..." />
    ...

次の XPath 式を解析すると、例外が発生します。

/rec:root/rec:dummy/com:item

XPathStylesheetDOM3Exception: プレフィックスは名前空間に解決する必要があります: com

これはブログで見つけたもので、Xalan について述べていますが、Xerces も同じ動作をしていることに気付きました。

それは、渡されたノードで見つかったマッピングのみを使用するためです。つまり、この場合は最上位の名前空間宣言にマッピングされます。そこで、名前空間宣言を最上位に移動して、次の XML 入力を取得します。

ソース

xmlns:comをルート タグに移動すると問題は解決しますが、そのファイルを制御することはできません。

4

2 に答える 2

4

xpath プレフィックスは、ドキュメントで使用されているプレフィックスとは関係ありません。xpath ハンドラーへの「名前空間へのプレフィックス」マッピングを提供する必要があります。標準の Java DOM ツールを使用して、NamespaceContextを XPath インスタンスに提供します。

于 2012-04-04T12:47:28.713 に答える
2

DOM レベル 3 XPath API を使用すると仮定すると、 http://xerces.apache.org/xerces2-j/javadocs/api/org/w3c/dom/xpath/XPathNSResolver.htmlを実装するクラスを作成する必要があります。 XPath 式で使用されるプレフィックスを解決する必要がある場合は、適切な名前空間 URI。その XPathNSResolver は、評価メソッドhttp://xerces.apache.org/xerces2-j/javadocs/api/org/w3c/dom/xpath/XPathEvaluator.html#evaluate%28java.langへの 3 番目の引数として渡す必要があります。 .String,%20org.w3c.dom.Node,%20org.w3c.dom.xpath.XPathNSResolver,%20short,%20java.lang.Object%29. 既に指摘したように、パス式のプレフィックスは XML 入力ドキュメントと同じである必要はありません。XPathNSResolver が、パス式で使用されるプレフィックスを XML ドキュメントで使用される名前空間 URI にマップすることを確認する必要があるだけです。

于 2012-04-04T13:14:26.390 に答える