一、支持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. django 后台静态文件不显示

    原文链接 https://my.oschina.net/VASKS/blog/874270 django admin svg 不显示.后台显示 xx.svg 200 但浏览器就是不显示. 百度了一圈, ...

  2. PHP学习之观察者模式

    <?php //观察者模式涉及到两个类 //男人类 和女朋友类 //男人类对象小明, 女朋友类对象小花.小丽 class Man { //用了存放观察者 protected $observers ...

  3. Java静态方法和实例方法区别详解

    静态方法和实例方法的区别主要体现在两个方面: 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式.而实例方法只有后面这种方 ...

  4. MongoDB的安装和配置成服务的三种方法

    1. Hotfix KB2731284 or later update is not installed的问题: If you are running any edition of Windows S ...

  5. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_15-异常处理-异常处理流程

    右侧是框架报的异常 不可预知的,例如数据库连不上这一类的.可以在map中制定某些类的异常,如果找不到就最右边的 99999的, 系统对异常的处理使用统一的异常处理流程: 1.自定义异常类型. 2.自定 ...

  6. [Scikit-learn] 2.5 Dimensionality reduction - Probabilistic PCA & Factor Analysis

    2.5.4. Factor Analysis PPCA的基本性质以及人肉推导: 以上假设z是标准正态分布的情况.以下是对z的分布的扩展,为general normal distribution. Fr ...

  7. Linux Shell列出网络中所有的活跃主机

    因为的的网段是 192.168.1.0/24 , 所以我只需遍历 192.168.1.1 到 192.168.1.255 之间的所有ip然后进行 ping 就可以了: test.sh: #!/bin/ ...

  8. spring中@Profile的作用

    根据系统环境的不同,Profile可以用来切换数据源.例如切换开发,测试,生产环境的数据源. 举个例子: 先创建配置类MainProfileConfig: @Configuration @Proper ...

  9. lnmp 命令 及其 TP5 部署遇到的一些问题

    1.添加站点域名命令: lnmp vhost add; 2.重置mysql密码: 第一种方法:用军哥的一键修改LNMP环境下MYSQL数据库密码脚本 一键脚本肯定是非常方便.具体执行以下命令: wge ...

  10. Spring boot 新建项目pom.xml文件报错 Failure to transfer org.springframework.boot:spring-boot-maven-plugin

    新建项目依赖下载时网络中断导致资源损坏 删除.m2\repository中后缀名为lastUpdated的文件 cd %userprofile%\.m2\repository for /r %i in ...