JavaScript 【 IE中的XML DOM 】

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!');        //循环后抛出错误
  }
View Code

 

二、载入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

 

 

 

原文地址:https://www.cnblogs.com/cpugege/p/3425527.html