注册 登录

清河洛

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

qingheluo2016-12-16清河洛200
创建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...

创建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字符串,如果想效果更好,可以添加换行符。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 + '错误代号:' + xmlDom.parseError.errorCode + '错误解释:' + xmlDom.parseError.reason);
}


网址导航