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);

  • 相关阅读:
    java简单计算器,只能鼠标点击数字
    可以掉落和滑动的星星
    servlet生成数字验证码
    web服务器底层-http请求与相应
    Codeforces 990D Graph And Its Complement 【构造】【性质】
    2018美团CodeM编程大赛 Round A Problem 2 下棋 【贪心】
    Codeforces 988F Rain and Umbrellas 【dp】
    Codeforces 988D Points and Powers of Two 【性质】【卡常】
    Codeforces 981D Bookshelves 【dp】【性质】
    POJ 2104 K-th Number 【主席树】【不带修改】
  • 原文地址:https://www.cnblogs.com/zhaow/p/9754395.html
Copyright © 2011-2022 走看看