zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    「日常训练」Single-use Stones (CFR476D2D)
    「日常训练」Greedy Arkady (CFR476D2C)
    「Haskell 学习」二 类型和函数(上)
    「学习记录」《数值分析》第二章计算实习题(Python语言)
    「日常训练」Alena And The Heater (CFR466D2D)
    Dubbo 消费者
    Dubbo 暴露服务
    Rpc
    git fail to push some refs....
    Spring Cloud (6)config 客户端配置 与GitHub通信
  • 原文地址:https://www.cnblogs.com/zhaow/p/9754395.html
Copyright © 2011-2022 走看看