首页 > js学习 > js基础知识 > IE浏览器(IE8及之前版本)中的XML处理
2016
12-16

IE浏览器(IE8及之前版本)中的XML处理

创建XMLDOM对象

IE浏览器是第一个原生支持XML的浏览器,而它是通过ActiveX对象实现的。这个对象,只有IE有,一般是IE9之前采用。微软当年为了开发人员方便的处理XML,创建了MSXML库,但却没有让Web开发人员通过浏览器访问相同的对象。

var xmlDom = new ActiveXObject('ActiveXObject类型(XML版本)字符串');

在所有版本(共六个)版本中微软只推荐三种:

1).MSXML2.DOMDocument.6.0:最可靠最新的版本

2).MSXML2.DOMDocument.3.0:兼容性较好的版本

3).MSXML2.DOMDocument:仅针对IE5.5之前的版本

这三个版本在不同的windows平台和浏览器下会有不同的支持,那么为了实现兼容

function createXMLDOM() {

var version = ['MSXML2.DOMDocument.6.0','MSXML2.DOMDocument.3.0','MSXML2.DOMDocument'];

for (var i = 0; i < version.length; i ++) {

try {

var xmlDom = new ActiveXObject(version[i]);

return xmlDom;

} catch (e) {

//跳过

}

}

throw new Error('您的系统或浏览器不支持MSXML!'); //循环后抛出错误

}

载入XML

如果已经获取了XMLDOM对象,那么可以使用loadXML()和load()这两个方法可以分别载入XML字符串或XML文件。

xmlDom.loadXML('<root version="1.0"><user>Lee</user></root>'); alert(xmlDom.xml);

loadXML参数直接就是XML字符串,如果想效果更好,可以添加换行符\n。xml属性可以序列化XML,获取整个XML字符串。

xmlDom.load('test.xml'); //载入一个XML文件 alert(xmlDom.xml);

当已经可以加载了XML,那么可以之前学习的DOM来获取XML数据,比如标签内的某个文本。

var user = xmlDom.getElementsByTagName('user')[0]; //获取<user>节点

alert(user.firstChild.nodeValue); //获取<user>里的值Lee

DOM不单单可以获取XML节点,也可以创建。

var email= xmlDom.createElement('email');

xmlDom.documentElement.appendChild(email);

同步及异步

load()方法是用于服务器端载入XML的,并且限制在同一台服务器上的XML文件。那么在载入的时候有两种模式:同步和异步。

所谓同步:就是在加载XML完成之前,代码不会继续执行,直到完全加载了XML再返回。好处就是简单方便、坏处就是如果加载的数据停止响应或延迟太久,浏览器会一直堵塞从而造成假死状态。

xmlDom.async = false; //设置同步,false

所谓异步(默认,可以省略该设置):就是在加载XML时,JavaScript会把任务丢给浏览器内部后台去处理,不会造成堵塞,但要配合readystatechange事件使用,所以,通常我们都使用异步方式。

xmlDom.async = true; //设置异步,默认

通过异步加载,我们发现获取不到XML的信息。原因是,它并没有完全加载XML就返回了,也就是说,在浏览器内部加载一点,返回一点,加载一点,返回一点。这个时候,我们需要判断是否完全加载,并且可以使用了,再进行获取输出。

XML DOM中readystatechange事件:该事件发生时,可以通过readyState获取就绪状态值,就绪状态值及其对应的说明如下:

1代表DOM正在加载、2代表DOM已经加载完数据、3代表DOM已经可以使用,但某些部分还无法访问、4代表DOM已经完全加载完成并访问

xmlDom.async = true; //设置异步,可以省略

xmlDom.onreadystatechange = function () {

if (xmlDom.readyState == 4){alert(xmlDom.xml);}//完全加载了,再去获取XML

}

xmlDom.load('test.xml');

将load()方法放到最后不会因为代码的顺序而导致没有加载。并且load()方法必须放在onreadystatechange之后,才能保证就绪状态变化时调用该事件处理程序,因为要先触发。

这里不能够使用this,不能够用IE的事件处理函数,原因是ActiveX控件为了预防安全性问题。

虽然可以通过XML DOM文档加载XML文件,但公认的还是XMLHttpRequest对象比较好。

解析错误

在加载XML时,无论使用loadXML()或load()方法,都有可能遇到XML格式不正确的情况。为了解决这个问题,微软的XML DOM提供了parseError属性,通过该属性的属性可以返回具体的错误信息。

errorCode:发生的错误类型的数字代号

filepos:发生错误文件中的位置

line:错误行号

linepos:遇到错误行号那一行上的字符的位置

reason:错误的解释信息

if (xmlDom.parseError == 0) {

alert(xmlDom.xml);

}else {

throw new Error('错误行号:' + xmlDom.parseError.line + '\n错误代号:' + xmlDom.parseError.errorCode + '\n错误解释:' + xmlDom.parseError.reason);

}

最后编辑:
作者:qingheluo
这个作者貌似有点懒,什么都没有留下。