3

IE XML DOMライブラリのtextプロパティのシムを作成しようとしていますが、空白の書式設定に関する問題が発生しました。

次のXMLのテキストプロパティを処理する場合

var doc1 = load_ie('<root><a>A</a><b>B</b></root>')
var doc2 = load_ie('<root><a>A</a>   <b>B</b></root>');

それらは異なる結果をもたらします:

doc1.text // 'AB'
doc2.text // 'A B' - the multiple spaces are compressed to a single space

ただし、驚いたことに、IEは、他のブラウザのように、x2に存在するスペースが存在することさえ認識していないようです。

doc1.documentElement.childNodes.length // 2
doc2.documentElement.childNodes.length // 2 (I expected 3!)

var doc3 = load_ie('<root><a>A</a> c  <b>B</b></root>');
doc3.documentElement.childNodes.length // 3

Google Chromeでテストを実行すると、doc3の場合と同様に、doc2の場合のノード数は3( "a"ノード、3つのスペースを持つテキストノード、および "b"ノード)です。IEが空白ノードを非表示にし、異なる結果を返す必要があるにもかかわらず、最初のケースと2番目のケースを区別できない場合、どうすればシムを作成できますか?


文字列から作成するXMLドキュメントをロードするためのコード:

load_ie = function(xmlstr){
    var doc = new ActiveXObject('Microsoft.XMLDOM');
    doc.async=false;
    doc.loadXML(xmlstr);
    return doc;
}

load_w3c = function(xmlstr){
    var p = new DOMParser();
    return p.parseFromString(xmlstr, 'text/xml');
}

ボーナス質問:

また、MSDNドキュメントに記載されている例も機能しません。それによると、次のXML

var d = load_ie(
    '<root att="   123   a      ">\n' +
    '     <a>   a   a   </a>\n' +
    '   <!--   comment   b   -->\n' +
    '   <?pi   pi   c   ?>\n' +
    '   <![CDATA[   cdata   d   ]]>\n' +
    '   e   f\n' +
    '</root>'
 );
 d.text;

与えるべき

"a a cdata d e f"

代わりに私は得る

"a   a       cdata   d   \n   e   f" 

私の側で奇妙な振る舞いを引き起こしている明らかな何かが欠けているのではないかと思います。

4

1 に答える 1

1

Internet Explorer の解析方法は MSXML API を使用します。この API は、空白を保持または折りたたむように構成できます。次のコードは、IE9 で動作します。

load_ie = function(xmlstr){
    var doc = new ActiveXObject('Microsoft.XMLDOM');
    doc.async=false;
    doc.preserveWhiteSpace=true;
    doc.loadXML(xmlstr);
    return doc;
}

var doc = load_ie('<root><a>A</a>   <b>B</b></root>');
console.log(doc.documentElement.text.length === 5)
console.log(doc.documentElement.childNodes.length === 3);
console.log(doc.documentElement.childNodes[1].nodeTypeString === "text");
于 2012-06-22T14:31:03.490 に答える