IE中的 XML DOM
在统一的正式规范出来以前,浏览器对于XML的解决方案各不相同。DOM2级提出了动态创建XML DOM规范,DOM3进一步增强了XML DOM。所以,在不同的浏览器实现XML的处理是一件比较麻烦的事情。
一、创建XMLDOM对象
var xmlDom = new ActiveXObject('MSXML2.DOMDocument');
微软的三种版本:
1.MSXML2.DOMDocument.6.0 最可靠最新的版本
2.MSXML2.DOMDocument.3.0 兼容性较好的版本
3.MSXML2.DOMDocument 仅针对IE5.5之前的版本
这三个版本在不同的windows平台和浏览器下会有不同的支持,那么为了实现兼容,我们应该考虑这样操作:
从6.0->3.0->备用版本这条路线进行实现,如下:
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,使用loadXML()和load()这两个方法可以分别载入XML字符串或XML文件:
1、
xmlDom.loadXML('<root version="1.0"><user>Lee</user></root>');
alert(xmlDom.xml);
2、
xmlDom.load('test.xml'); //载入一个XML文件
alert(xmlDom.xml); //将其序列化
三、当你已经可以加载了XML,那么你就可以用之前学习的DOM来获取XML数据,比如标签内的某个文本。
1、
var user = xmlDom.getElementsByTagName('user')[0]; //获取<user>节点
alert(user.tagName); //获取<user>元素标签
alert(user.firstChild.nodeValue); //获取<user>里的值Lee
2、
DOM不单单可以获取XML节点,也可以创建。
var email= xmlDom.createElement('email');
xmlDom.documentElement.appendChild(email);
<script type="text/javascript"> function createXMLDOM() { var version = [ "MSXML2.DOMDocument6.0", "MSXML2.DOMDocument3.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库"); } var xmlDom = createXMLDOM(); // xmlDom.loadXML("<root><user>cpu</user></root>");//加载XML字符串 // alert(xmlDom.xml); //序列化XML,打印字符串 xmlDom.load("abc.xml"); var user = xmlDom.getElementsByTagName("user")[0]; // alert(user.nodeType); var bbb = xmlDom.createElement('bbb'); var root = xmlDom.documentElement; root.appendChild(bbb); var bbbText = xmlDom.createTextNode('kkk'); bbb.appendChild(bbbText); alert(xmlDom.xml); </script>
四、同步和异步
/* //默认使用的异步加载 var xmlDom = createXMLDOM(); xmlDom.load('demo.xml'); alert(xmlDom.xml); //PS:在服务器端,默认使用的是异步加载。 //两个原因:1.在服务器端,使用的异步加载,load()还没有加载完毕,就去打印xmlDom.xml序列化的字符串 //使用同步加载 var xmlDom = createXMLDOM(); xmlDom.async = false; //同步设置false,异步设置true,默认是异步 xmlDom.load('demo.xml'); alert(xmlDom.xml); //使用同步记载延迟的PHP文件 var xmlDom = createXMLDOM(); xmlDom.async = false; //同步设置false,异步设置true,默认是异步 xmlDom.load('demo.php'); //加载这个PHP文件,使用了5秒,并且后面的代码没有执行 alert(xmlDom.xml); //5秒后才执行的 //PS:使用同步加载,如果延迟,那么整个浏览器就假死了。 */ //我们应该用异步 var xmlDom = createXMLDOM(); xmlDom.async = true; //同步设置false,异步设置true,默认是异步 xmlDom.onreadystatechange = function () { //这个事件必须放在load()方法前面,意图先载入事件,再当load()执行的似乎才能激活 //alert(xmlDom); if (xmlDom.readyState == 4) { //xmlDom.parseError.errorCode 错误代号,没有错误是返回0 if (xmlDom.parseError.errorCode == 0) { //alert(this === xmlDom); //this执行的是window alert(xmlDom.xml); } else { throw new Error('错误行号:' + xmlDom.parseError.line + ' 错误代号:' + xmlDom.parseError.errorCode + ' 错误解释:' + xmlDom.parseError.reason); } } } xmlDom.load('demo.xml'); //onreadystatechange比较特殊,里面的this表示 window而不是执行的object