0

私はIE9でいくつかのxpathクエリを作成しようとしていますが、いくつかのソートは成功していますが、確かに試しているだけで、何が機能し、何機能しないかを明確に理解できません。

私は2つのことをしたい:

  1. 読み込まれた xml からのカスタム名前空間の要素のクエリ
  2. カスタム名前空間属性を持つインライン svg のクエリ要素

ポイント1は、次のコードを使用して機能します:

doc.setProperty( "SelectionLanguage", "XPath" );
doc.setProperty( "SelectionNamespaces", xpathNsString );
svg = cloneSVGNode( doc.selectSingleNode( '//graphic/svg:svg' ) );

ここdocで、ロードされた xml への参照です。xpathNsString は次のとおりです。

"xmlns=\"http://www.w3.org/1999/xhtml\" " +
"xmlns:svg=\"http://www.w3.org/2000/svg\" "+
"xmlns:dc=\"http://purl.org/dc/elements/1.1/\" "+
"xmlns:cc=\"http://creativecommons.org/ns#\" "+
"xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" "+
"xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\" "+
"xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" "+
"xmlns:mine=\"http://www.mine.org\" "+
"xmlns:html=\"http://www.w3.org/1999/xhtml\"";

そしてcloneSVGNode、結果全体を複製してDOMに追加できるようにする関数-これは機能します。

コードの後半で、次のようなクエリを使用して、(現在 DOM にある) SVG のいくつかの要素をクエリしたいと思います。

//svg:g[@mine:my-name="my-value"]

しかし、これは機能しません。IE は DOM 要素に対する xpath クエリをサポートしていないことを読みましたが、このスタックオーバーフローの質問でどのように説明されているかは、これを行う方法があるようです。そこで、質問の回答 ( http://sourceforge.net/projects/html-xpath/ ) に記載されているフレームワークのバージョンを取得し、いくつかのテストを行いました。その結果、いくつかの html 要素を取得できましたが、名前空間と svg で機能することを拒否し、「プレーン xml」で機能しました。それにもかかわらず、lib のソースコードをちらりと見ると、次の戦略を確認できました (これについては完全にはわかりませんが、全体としてはこのようなものだと思います)。

  1. ノードを新しいxmlドキュメントに複製します
  2. クエリ xpath
  3. 実ノードの相手ノードを返す

それで、IE9にDOMの名前空間付きxpathクエリを作成させることは可能ですか?それはxmlで可能であり、domノードはxmlに変換されますか?

こんにちはフィリップ

編集:

私は試みを続け、最終的に成功することができました.どういうわけか、コードは混乱していますが、結果をもたらします. だから私は今、「答えはイエスです、可能です」と言うことができます。. まだいくつかのテストが必要ですが、全体的なアプローチは次のとおりです。

  1. 新しい空の xml ドキュメントを作成する
  2. 適切な名前空間プロパティを設定します (上記) !IMPORTANT
  3. コンテキスト ドキュメントのツリーを再帰的にたどり、新しい xml ドキュメントから新しい要素を作成してすべての要素を複製します。
  4. それにより: コンテキスト ドキュメントの要素から一意の ID を生成し、それを複製された要素とコンテキスト ドキュメントの要素 (存在しない場合) に割り当てます。「元の」要素と「複製された」要素を含むオブジェクトを、ID をキーとするハッシュマップに挿入します。
  5. xpath を使用して新しいドキュメントをクエリする
  6. 結果を取得し、ID を取得して、マップから元の要素を取得します。
  7. 元々何も持っていなかった要素からすべてのIDを削除することにしました。

終わり...

興味がある場合は、コードを投稿できます...

4

1 に答える 1

0

したがって、私の編集に基づいて、名前空間が機能するようにこのスクリプトを調整/パッチし、API を標準に近づけるためにいくつかのゲッターを追加しました。テストページはこちらでご覧いただけます。私の目的にはうまく機能しますが、一種のハックであるという理由だけで欠点があるため、IE が検出された場合にのみスクリプトを含めます。

問題:

  • 上記の質問のステップ 6 を満たすために、dom は ID で埋められます。
  • 「onpropertychange」リスナーが DOM のすべての要素にアタッチされ、
  • ie のパフォーマンスは最大 20 倍遅くなり、
  • 奇妙なことに、すべての名前空間のアイテムが IE によって検出されるわけではありません。
  • ...

今のところ、クライアント側での xpath の使用に関する調査を終了し、次のように結論付けます。

クライアント側で xml および xpath のすべての名前空間機能を使用することを検討している場合、次のことを行うと機能します。

  • Web サイトはヘッダー付きで配信するContent-type: application/xhtml+xml必要があるため、ページは有効な xhtm で構成されている必要があります。
  • また、タグX-UA-Compatible: IE=9付きのヘッダーが必要です。<meta http-equiv="X-UA-Compatible" content="IE=9" />
  • 名前空間は事前に宣言する必要があり、テスト ページとパッチを適用したスクリプトでは、これは名前空間リゾルバーで行われます。
  • 本当に生産的になる前に、必要なすべてのクエリの要素を IE が実際に見つけられるかどうかを確認する必要があります。
  • IE の xpath-queries は静かで遅いため、それらを広範囲に使用したり、IE を使用したりするのは良い考えではないかもしれませんが、それは別の問題です。
于 2012-09-21T08:02:34.737 に答える