3

我正在尝试为 IE XML DOM 库的text属性编写 shim,但我遇到了有关格式化空白的问题。

如果我处理以下 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 上运行测试,则 doc2 案例中的节点数为 3(“a”节点、具有 3 个空格的文本节点和“b”节点),类似于 doc3 案例的工作方式。如果 IE 对我隐藏空白节点并且我无法区分第一种和第二种情况,即使它们需要返回不同的结果,我将如何编写我的 shim?


从字符串加载创建 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,可以将其配置为保留或折叠空白。以下代码在 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 回答