zoukankan      html  css  js  c++  java
  • 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

     

     

     

  • 相关阅读:
    Vue实战笔记
    项目随笔
    Vuex数据可视化
    Vue项目中,要保证某个部分的高度,应该怎么设置
    (转)http authorization 基本认证
    多页应用和单页应用
    Vue项目中使用webpack配置了别名,引入的时候报错
    [转载]解决在win10中webstrom无法使用命令行(Terminal)
    (转)巧用可视区域
    前端管理后台集成解决方案---vue-element-admin
  • 原文地址:https://www.cnblogs.com/cpugege/p/3425527.html
Copyright © 2011-2022 走看看