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 ...
随机推荐
- Pro*C编程研究一:从.pc到.exe
[第一步]在Windows下编辑一个.pc程序(Pro*C源程序,作者用到:C:\proctest\exam1.pc),其内容如下: #include <stdio.h> #include ...
- ccf 201803-3 URL映射(python)
使用正则表达式 import re import collections n, m = list(map(int, input().split())) arr = ['']*(m+n) for i i ...
- centos7 搭建FTP
通过yum安装vsftpd yum install -y vsftpd 修改vsftpd的配置文件 vim /etc/vsftpd/vsftpd.conf 修改配置文件如下: 1.不允许匿名访问 an ...
- strace调试跟踪程序运行状态
查看进程调用和执行状态 : strace -f -F -o debug.log -p PID(某个进程ID) 参考资料: http://www.itshouce.com.cn/linu ...
- python3 高级编程(一) 使用__slots__
使用__slots__的目的:限制实例的属性 用法:定义class的时候,定义一个特殊的__solts__变量,来限制实例能添加的属性. class Student(object): __slots_ ...
- ME21N屏幕格式配置路径
物料管理->采购->采购订单->定义屏幕层的屏幕格式
- RocketMQ采坑记
先来一篇解释比较多的实例 https://www.cnblogs.com/super-d2/p/4154541.html No route info of this topic, PushTopic ...
- iOS-保存图片到相册
//保存 UIButton *saveBtn = [[UIButton alloc] init]; // saveBtn.frame = CGRectMake((screenWi ...
- QML使用Python的函数
有2种方法: 一. QML中定义一个信号,连接Python里的函数: 这里的函数不用特意指明为槽函数,普通函数即可. QML的信号连接Python的函数 QML:首先在QML中定义一个信号,这里的信号 ...
- web框架初阶
第一站 文件结构:web--- |--home.py #页面处理函数 |--index.py #主体函数 |--indexPlus.py #主体函数加强版 |--webdaem.py #通过we ...