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);
IE各版本处理XML的方式的更多相关文章
- SpringBoot 整合 Mybatis + Mysql——XML配置方式
一.介绍 SpringBoot有两种方法与数据库建立连接,一种是集成Mybatis,另一种用JdbcTemplate,本文主要讨论集成Mybatis方式. SpringBoot整合Mybatis也有两 ...
- 转-springAOP基于XML配置文件方式
springAOP基于XML配置文件方式 时间 2014-03-28 20:11:12 CSDN博客 原文 http://blog.csdn.net/yantingmei/article/deta ...
- 获取机器安装.NET版本的几种方式
当调查应用程序问题时,通常需要先确认目标机器所安装的 .NET Framework 的版本.可以通过如下方式来确认版本号: 通过控制面板安装程序查询 通过查询注册表获取版本信息 通过查看安装目录获取版 ...
- Android中的三种XML解析方式
在Android中提供了三种解析XML的方式:SAX(Simple API XML),DOM(Document Objrect Model),以及Android推荐的Pull解析方式.下面就对三种解析 ...
- struts_20_对Action中所有方法、某一个方法进行输入校验(基于XML配置方式实现输入校验)
第01步:导包 第02步:配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app ...
- struts2视频学习笔记 22-23(基于XML配置方式实现对action的所有方法及部分方法进行校验)
课时22 基于XML配置方式实现对action的所有方法进行校验 使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和action类 ...
- 【原创】Android 4.4前后版本读取图库图片方式的变化
Android 4.4前后版本读取图库图片方式的变化 本文讲述Android 4.4(KitKat)前后访问图库以及访问后通过图片路径读取图片的变化 Android 4.4(KitKat)以前 ...
- hibernate 联合主键生成机制(组合主键XML配置方式)
hibernate 联合主键生成机制(组合主键XML配置方式) 如果数据库中用多个字段而不仅仅是一个字段作为主键,也就是联合主键,这个时候就可以使用hibernate提供的联合主键生成策略. 具体 ...
- web.xml中配置Spring中applicationContext.xml的方式
2011-11-08 16:29 web.xml中配置Spring中applicationContext.xml的方式 使用web.xml方式加载Spring时,获取Spring applicatio ...
随机推荐
- Axure实现提示文本单击显示后自动消失的效果
Axure实现提示文本单击显示后自动消失的效果 方法/步骤 如图所示,框出的部分为提示文本(已经命名为tooltip),希望达到的效果是默认加载时不显示,点击帮助图标后显示,且2秒后自动消失. ...
- java中json的使用和解析
1.创建json对象 1.1 创建JSONObject对象 使用map初始化json @Test public void test1() { Map<String, Object> map ...
- go协程理解
一.Golang 线程和协程的区别 备注:需要区分进程.线程(内核级线程).协程(用户级线程)三个概念. 进程.线程 和 协程 之间概念的区别 对于 进程.线程,都是有内核进行调度,有 CPU 时间片 ...
- C之数据类型
java的数据类型 byte 1个字节 boolean 1个字节 short 2个字节 char 2个字节 int 4个字节 float 4个字节 long 8个字节 double 8个字节 c语言的 ...
- Gevent模块
前言 如何在使用1个线程的前提下,提网站的并发性,使用协程? 如果要使用协程首先要解决2个问题: 1.如何检测到代码中遇到了IO操作?(XX) 2.如何在线程代码里上下切换?(Greelet模块) 而 ...
- linux安装IDEA 2017
下载 IDEA 2017 链接:http://pan.baidu.com/s/1skTKdFR 密码:yug3 解压 下载的文件 tar zxvf idea-IU-172.4155.36.tar ...
- Flutter酷炫的路由动画效果
现在Flutter的路由效果已经非常不错了,能满足大部分App的需求,但是谁不希望自己的App更酷更炫那,下面介绍几个酷炫的路由动画. 其实路由动画的原理很简单,就是重写并继承PageRouterBu ...
- Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings)
Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings) 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子 ...
- go module配置
参考文章: http://c.biancheng.net/view/4774.html 1.
- vue中 :style 与 :class 三元运算符使用
参考链接:https://www.jianshu.com/p/31664974303d