IE各版本处理XML的方式

一、支持DOM2级的方式
我们知道,现阶段支持DOM2的主流浏览器有IE9+、Firefox、Opera、Chrome和Safari。
1.1、创建XML
//实际上,DOM2级在document.implementation中引入了createDocument()方法来创建XML文档。其语法是:
var xmldom = document.implementation.createDocument(namespaceUri, root, doctype);  //《高三》P521

//然而在实际开发中,很少需要从头开始创建一个XML文档,然后再使用DOM文档为其添加元素。
//更常见的情况往往是将某个XML文档解析为DOM结构,或反之。
//而关于解析或反解析XML文档,IE各版本的浏览器与其他浏览器又有区别:

1.2、XML解析为DOM文档
//支持DOM2级的浏览器通过DomParser类型的parseFromString()方法来解析XML的。
//然而在处理parseFromString()方法解析错误的方式上,IE9与其他浏览器不同,
//Firefox、Opera、Chrome和Safari会在解析错误时返回一个包含错误信息parsererror的Document对象,而IE9+则直接抛出错误信息。
//为了实现兼容,解析代码将会是如下形式:
var parser = new DOMParser(),
xmldom,
errors;
try {
    //下面故意缺少</root>,将会导致解析错误
    xmldom = parser.parseFromString("<root>", "text/xml");
    errors = xmldom.getElementsByTagName("parsererror");
    if (errors.length > 0) {
        throw new Error("Parsing error!");
    }
}
catch (ex) {
    alert("Parsing error!");
}
//详见《高三》P522

1.3、DOM文档序列化为XML
//支持DOM2级的浏览器通过XMLSerializer类型的SerializeToString()方法来解析XML的。
var serializer = new XMLSerializer();
var xml = serializer.SerializeToString(xmldom);
alert(xml);

二、IE8及之前版本
//IE8以及以前的老版本是通过插件(ActiveXObject)的形式实现了对XML的操作。
//我们先来介绍下IE的插件(更多内容参考《高三》P211):
//在IE中检测插件的唯一方式就是使用专有的ActiveXObject类型,并尝试创建一个特定插件的实例。
//IE是以COM对象的方式实现插件的,而COM对象使用唯一标识符来标识,因此,想要检查特定的插件,就必须知道其COM标识符。
//例如,Flash的COM标识符是ShockwaveFlash.ShockwaveFlash,知道了唯一标识符,就能创建相应的插件对象,如:
var flash = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");

/*
//下面总结下IE的COM标识符:
ShockwaveFlash.ShockwaveFlash
QuickTime.QuickTime
MSXML2.DOMDocument.6.0/MSXML2.DOMDocument.3.0/MSXML2.DOMDocument(创建解析XML的对象实例)
MSXML2.XMLHttp.6.0/MSXML2.XMLHttp.3.0/MSXML2.XMLHttp(创建XMLHttpRequest实例)
*/
//同样,要创建一个XML文档,也要使用ActiveXObject构造函数并为其传入一个表示XML文档版本的字符串(即COM标识符)。
//建议使用的标识符为MSXML2.DOMDocument.6.0/MSXML2.DOMDocument.3.0/MSXML2.DOMDocument。  详见《高三》P524
function createDocument() {
    if (typeof arguments.callee.activeXString != "string") {
        var versions = ["MSXML2.DOMDocument.6.0", "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument"],
        i, len;

        for (var i = 0, len=versions.length; i < len; i++) {
            try {
                new ActiveXObject(versions[i]);
                arguments.callee.activeXString = versions[i];
                break;
            }
            catch (ex) {
                //跳过
            }
        }
    }

    return new ActiveXObject(arguments.callee.activeXString);
}

//要解析XML,必须先创建一个DOM文档,然后调用loadXML()或load()方法。(注意这两个方法的区别)
var xmldom = createDocument(); //创建解析对象
xmldom.loadXML("<root><child/></root>");
xmldom.documentElement.tagName;  //"root"
xmldom.documentElement.firstChild.tagName;  //"child"

var another=xmldom.createElement("son");
xmldom.documentElement.appendChild(another);
var childrens = xmldom.documentElement.childElementCount //2


综上所述,可以使用一种跨浏览器处理XML的方案
关于跨浏览器(包括IE各版本)实现XML解析和序列化的方案,具体实现:《高三》P527
对于解析XML而言(XML ---> DOM):
function parseXml(xml) {
    var xmldom = null;
    //for DOM2级
    if (typeof DOMParser != "undefined") {
        xmldom = (new DOMParser()).parseFromString(xml, "text/xml");
        var errors = xmldom.getElementsByTagName("parsererror");
        if (errors.length > 0) {
            throw new Error("XML parsing error" + errors[0].textContent);
        }
    }
    //for IE8-
    else if (typeof ActiveXObject != "undefined") {
        xmldom = createDocument();
        xmldom.loadXML(xml);
        if (xmldom.parseError != 0) {
            throw new Error("XML parsing error" + xmldom.parseError.reason);
        }
    }
    else {
        throw new Error("No XML parser available.");
    }

    return xmldom;
}

//在使用这个函数解析XML字符串时,应该将它们放在try-catch语句中,以防止错误:
var xmldom = null;
try {
    xmldom = parseXml("<root><child/></root>");
}
catch (ex) {
    alert(ex.Message);
}
        
对于序列化XML而言(DOM ---> XML):
function serializeXml(xmldom) {
    //for DOM2级
    if (typeof XMLSerializer != "undefined") {
        return (new XMLSerializer()).serializerToString(xmldom);
    }
    //for IE8-
    else if (typeof xmldom.xml != "undefined") {
        return xmldom.xml;
    }
    else {
        throw new Error("Could not serializer XML DOM.");
    }
}

var xml = serializeXml(xmldom);

posted @ 2018-10-08 15:00  skybirdzw  阅读(526)  评论(0编辑  收藏  举报