ページにフォームを追加するために XML ドキュメントを取得するページがあります。私の XML 構造は、次の行に沿って、可能な限り単純化されています。
<root><someXMLElement><input type="text"></input></someXMLElement></root>
問題なく xml 文字列を取得できます。これはすべて Chrome、FireFox、IE10 で正常に動作しますが、別のマシンの IE8 または IE10 互換ビューでページを開くと、XML が次のように使用できない状態に変換されます。
<DIV><INPUT type=text></INPUT/></HOFCDHIDDENINPUTS/></ROOT/></DIV>
私はもともと XML 応答を取得していて、次の行に沿って、ドキュメントの DOM に最初に配置することなく、それを動的に解析しようとしていました。
var xml = http.responseText;
var xmlElements = $(xml).filter("root").html();
...do work on xmlElements
しかし、IE8 では $(xml).filter も $(xml).find も値を返しませんでした。これはかなり似ているように見えました: jQuery .find() は IE ではデータを返しませんが、Firefox と Chrome ではデータを返しますが、 ajax を使用せずに xml をインラインで記述し、jQuery ParseXML または ActiveX を使用しようとしても、この問題は解決しません。パーサーは問題を解決するために何もしませんでした。解析された XML はまだ find() から何も返されませんでした。innerHTML を取り巻く IE8 の問題についていくつかの場所で読んだので、変数内の動的 DOM に対する別の解決策を選択しました。代わりに、document.createElement を使用して要素を作成し、この要素の innerHTML に応答を追加してから、http://domscripting.com/blog/display/99と同じ行に沿って、これをドキュメント自体に追加しました。、私のコードの簡略化されたバージョンは次のとおりです。
$(document).ready(function () {
var XMLContainer = document.createElement("div");
XMLContainer.innerHTML
= "<root><someXMLElement><input type=\"text\"></input></hofcdhiddeninputs></root>"
document.body.appendChild(XMLContainer);
var DOMAccessibleXML = $("body").find("root").html();
または var DomAccessibleXML = document.body.getElementsByTagName[0].innerHtml });
また、jQuery で要素を作成し、append() 関数を使用するだけでなく、innerText を使用してみました。結果はどこも同じでした。私の XML は私のページの要素に追加されましたが、追加のある時点で次のように変換されました。場合によっては、要素を完全に除外するか (空の要素の場合)、単に開始タグを削除します (わかりません)。これが jQuery の有無にかかわらず発生し、IE8 でのみ発生するという事実から、追加中に発生していると思われます。補足として、上記の DomAccessibleXML を警告すると、空白になり、以前の問題が表示されます。
したがって、私が必要としているのは、可能であれば JavaScript と jQuery を使用して、XML ドキュメントの DOM をトラバースして操作する機能です。解決策が最初に手元のページに XML を追加することである場合、IE8 でそれを壊さないようにする方法が必要です。解決策が動的 DOM を作成することである場合、jQuery find() で結果を取得する方法、または jQuery の検索またはフィルターを使用せずに値を取得する別の方法が必要です。
ご検討いただきありがとうございます。
編集 1: Windows 7、IE8.0.7601、IIS 7.5.7600、jQuery 1.8.0 および 1.5.2 に存在する問題
編集 2: サンプル コードに xml 宣言を追加することで XML を解析できるようになりましたが、まだ innerHTML または getElementsByTagName にアクセスできません。以下のコードでは、xmlDoc.documentElement.xml は正しい文字列を返しますが、xmlDoc.documentElement.getElementsByTagName("root").length は 0 を返します。この時点で、innerHTML を回避する純粋な DOM 操作でこれを達成できると思いますが、この制約ですべてを書き直さないことを非常に好むでしょう。
var XMLContainer = document.createElement("div");
var XMLContainer = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><root><someXMLElement><input type=\"text\">text</input></someXMLElement></root>";
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc.loadXML(XMLContainer);
alert(xmlDoc.documentElement.xml);
alert(xmlDoc.documentElement.getElementsByTagName("root").length);
編集 3: どーも!documentElement はルートを参照します。getElementsByTagName('someXMLElement') は期待どおりに機能します。より大きなドキュメントを解析できる場合、これは機能するはずですが、innerHTML の問題は別として、追加時に IE8 が要素をマングルする理由を知りたいと思います。何かご意見は?