一、支持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);

IE各版本处理XML的方式的更多相关文章

  1. SpringBoot 整合 Mybatis + Mysql——XML配置方式

    一.介绍 SpringBoot有两种方法与数据库建立连接,一种是集成Mybatis,另一种用JdbcTemplate,本文主要讨论集成Mybatis方式. SpringBoot整合Mybatis也有两 ...

  2. 转-springAOP基于XML配置文件方式

    springAOP基于XML配置文件方式 时间 2014-03-28 20:11:12  CSDN博客 原文  http://blog.csdn.net/yantingmei/article/deta ...

  3. 获取机器安装.NET版本的几种方式

    当调查应用程序问题时,通常需要先确认目标机器所安装的 .NET Framework 的版本.可以通过如下方式来确认版本号: 通过控制面板安装程序查询 通过查询注册表获取版本信息 通过查看安装目录获取版 ...

  4. Android中的三种XML解析方式

    在Android中提供了三种解析XML的方式:SAX(Simple API XML),DOM(Document Objrect Model),以及Android推荐的Pull解析方式.下面就对三种解析 ...

  5. struts_20_对Action中所有方法、某一个方法进行输入校验(基于XML配置方式实现输入校验)

    第01步:导包 第02步:配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app ...

  6. struts2视频学习笔记 22-23(基于XML配置方式实现对action的所有方法及部分方法进行校验)

    课时22 基于XML配置方式实现对action的所有方法进行校验   使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和action类 ...

  7. 【原创】Android 4.4前后版本读取图库图片方式的变化

    Android 4.4前后版本读取图库图片方式的变化   本文讲述Android 4.4(KitKat)前后访问图库以及访问后通过图片路径读取图片的变化   Android 4.4(KitKat)以前 ...

  8. hibernate 联合主键生成机制(组合主键XML配置方式)

    hibernate 联合主键生成机制(组合主键XML配置方式)   如果数据库中用多个字段而不仅仅是一个字段作为主键,也就是联合主键,这个时候就可以使用hibernate提供的联合主键生成策略. 具体 ...

  9. web.xml中配置Spring中applicationContext.xml的方式

    2011-11-08 16:29 web.xml中配置Spring中applicationContext.xml的方式 使用web.xml方式加载Spring时,获取Spring applicatio ...

随机推荐

  1. Xshell登录Vagrant方式

    Xshell登录Vagrant方式 我上一篇文章 介绍了vagrant 如何创建虚拟机集群,在上篇文章的基础上,用xshell 登录 虚拟机发现 默认是无法使用账号密码登录root账号,只能使用vag ...

  2. leetcode 96. Unique Binary Search Trees 、95. Unique Binary Search Trees II 、241. Different Ways to Add Parentheses

    96. Unique Binary Search Trees https://www.cnblogs.com/grandyang/p/4299608.html 3由dp[1]*dp[1].dp[0]* ...

  3. Flex 弹性盒子布局使用教程

    本文转载于<https://blog.csdn.net/lyznice/article/details/53981062>

  4. mysql软件升降级及配置参数

    1.下载mysql5.7的软件 https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.20-linux-glibc2.12-x86_64.tar.g ...

  5. VLC播放器web插件接口(Part1)

    本文转自:http://blog.csdn.net/xiaoxiaoxuewen/article/details/7698803Embed tag attributesTo embed the plu ...

  6. java 枚举和数值的相互转换

    枚举简介 enum 的全称为 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中 在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而 ...

  7. JAVA 基础编程练习题32 【程序 32 左移右移】

    32 [程序 32 左移右移] 题目:取一个整数 a 从右端开始的 4-7 位. 程序分析:可以这样考虑: (1)先使 a 右移 4 位. (2)设置一个低 4 位全为 1,其余全为 0 的数.可用~ ...

  8. [转]德哥的PostgreSQL私房菜 - 史上最屌PG资料合集

    链接地址:https://yq.aliyun.com/articles/59251

  9. dlopen, dlsym今天才刚知道干什么用的,羞死人了

    dlopen, dlsym今天才刚知道干什么用的,羞死人了

  10. Git常用命令速查表,新手必备版本控制

    Git 跟 SVN 一样,都是用于管理代码的版本控制工具.无论在项目中,我们负责哪一块,只要需要编写代码,就必须熟悉Git(依公司要求而定). 当然,用的越熟练,处理的项目越顺利,离出任CTO.迎娶白 ...