3

Firefox JavaScript コンソール:

parser = new DOMParser();

foo = parser.parseFromString('<foo></foo>', "text/xml");
res = foo.evaluate("/foo", foo, null, 0, null);
res.iterateNext();
> [object Element]

foo = parser.parseFromString('<foo xmlns="http://foo.bar.baz/quux"></foo>', "text/xml");
res = foo.evaluate("/foo", foo, null, 0, null);
res.iterateNext();
> null

res = foo.evaluate("*[1]", foo, null, 0, null);
res.iterateNext();
> [object Element]

XML ドキュメントに xmlns が含まれていない場合、正しく解析およびクエリされます。その場合、タグ名と属性名でクエリを実行できなくなります。ただし、ワイルドカードとインデックスを使用したクエリは機能します。同じことが Chrome でも見られます。デフォルトの名前空間リゾルバーとカスタムの名前空間リゾルバーを作成して使用しても役に立ちません。助言がありますか?

4

1 に答える 1

2

名前空間を扱うときは、2 つのことを行う必要があります。

  1. XPath 式で名前空間を使用します。あなたのドキュメントには接頭辞がないので、私は選んだだけnsです。実際のコードでは、よりわかりやすいものを使用することをお勧めします。
  2. 名前空間リゾルバを追加します。これは、実際には の 3 番目のパラメータとして渡される関数ですevaluate(...)

すべてをまとめると、コードは次のようになります。

parser = new DOMParser();
foo = parser.parseFromString('<foo xmlns="http://foo.bar.baz/quux"></foo>', "text/xml");
res = foo.evaluate("/ns:foo", foo, function(prefix) {
    if (prefix === 'ns') {
        return 'http://foo.bar.baz/quux';
    } else {
        return null
    }
}, 0, null);
res.iterateNext();

期待どおりに戻ります:

<foo xmlns="http://foo.bar.baz/quux"></foo>

*名前空間を無視するワイルドカード マッチャーを使用しているため、3 番目のクエリには結果があります。名前空間を登録せずにワイルドカード マッチャーを使用する別の XPath 式は次のようになります。

//*[local-name() = 'foo']
于 2013-10-18T08:14:36.500 に答える