zoukankan      html  css  js  c++  java
  • 浅谈关于JavaScript解析XML文件的注意事项

    之前在重庆农商行的时候做项目,涉及到一个级联的功能,需要从XML中读取数据存到select框中。

     
    开始的时候一直出错,首先是火狐浏览器报错、但是IE正常,后来是火狐浏览器不报错了但是不显示、而IE依然显示。
     
    经过一番仔细的研究,总算解决了问题,下面我总结一下, 希望给更多的人带来帮助。
     
    首先呢,是页面加载的时候要把数据从XML中读取并且存入select中的option 。
     
    以下是详细的代码
     
     
    第一步:以下是我所定义的XML代码 名称为school.xml
    <?xml version="1.0" encoding="UTF-8" ?>
    <schools>
      <province name="北京市">
      <school>北京大学</school>
      <school>清华大学</school>
      <school>中国人民大学</school>
      <school>北京交通大学</school>
      <school>北京工业大学</school>
      <school>北京航空航天大学</school>
      <school>北京大学(医学部)</school>
      <school>北京理工大学</school>
      <school>北京科技大学</school>
      <school>中央民族大学</school>
     </province>
     <province name="天津市">
      <school>南开大学</school>
      <school>天津大学</school>
      <school>天津科技大学</school>
      <school>天津工业大学</school>
      <school>中国民航大学</school>
     </province>
     <province name="上海市">
      <school>复旦大学</school>
      <school>同济大学</school>
      <school>上海交通大学</school>
      <school>华东理工大学</school>
      <school>上海理工大学</school>
     </province>
    </schools>

    第二步:以下这是Javascript的代码

    <script type="text/javascript">
    
    window.onload = function(){ 
        //声明XML对象
        var xmlhttp; 
        //  IE7+, Firefox, Chrome, Opera, Safari 等等都支持XMLHttpRequest,所以用new XMLHttpRequest();可直接获取对象
        if (window.XMLHttpRequest) {  
            xmlhttp = new XMLHttpRequest();
        }
        //但是 IE6、IE5等等不支持XMLHttpRequest,所以用以下的方式获取,创建一个空的微软 XML 文档对象
        else {// code for IE6, IE5
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }     
    
        //打开XML文档  我的这句话是我的XML文档所在的路径 
       <s:property value="webPath" />/resource/xml/schools.xml  
        //之所以后面是false,意思是:关闭异步加载,这样确保在文档完全加载之前解析器不会继续脚本的执行  
        xmlhttp.open("GET", "<s:property value="webPath" />/resource/xml/schools.xml", false);
        xmlhttp.send();
          
        var xmlDom = xmlhttp.responseXML;
        
           //获取xml文件的根节点  
        var root = xmlDom.documentElement;
        
           
          
        //获取根节点下面的省节点  
        var provinces = root.childNodes;  
        
          
        var province = document.getElementById("province"); 
    
        for (var i = 0; i < provinces.length; i++) {  
            //获取省节点的name属性的值  
            if(provinces[i].nodeType == 1){
                var name = provinces[i].getAttribute("name");  
                    //创建一个option  
                var opt = document.createElement("option");  
                   //为option添加文本  
                opt.appendChild(document.createTextNode(name));  
                //添加到父节点中  
                province.appendChild(opt);  
            }
        }  
          
        var cities = document.getElementById("PRB_SCHOOLNAME"); 
        province.onchange = function(){  
            var pce = document.getElementById("province");  
            var opts = pce.options;  
            //根据下标获取选中的OPTION  
            var opt1 = opts[pce.selectedIndex];  
            var name = opt1.innerHTML;  
            for (var i = 0; i < provinces.length; i++) {  
                //获取省节点的name属性的值  
                if(provinces[i].nodeType == 1){
                    var name1 = provinces[i].getAttribute("name");  
                    if (name == name1) {  
                        cities.length = 1;//每次改变的时候清空  
                        var pros = provinces[i];  
                        var citys = pros.childNodes;  
                          
                        for (var j = 0; j < citys.length; j++) {  
                         if(citys[j].nodeType == 1){
           //创建一个option  
           var cityName;
           if(citys[j].text){
            cityName = citys[j].text;
           }else{
            cityName = citys[j].textContent
           }
           var opt = document.createElement("option");  
           //为option添加文本  
           opt.appendChild(document.createTextNode(cityName));  
           //添加到父节点中  
           cities.appendChild(opt);  
          } 
                        }  
                    }  
                }  
            }  
        }  
    } 
    
    </script>

    第三步:以下是html页面body中的代码

    <span>  
                         <select id="province" name="province">  
                             <option>请选择省</option>  
                         </select>  
                     </span>  
                     <span>  
                         <select id="PRB_SCHOOLNAME" name="PRB_SCHOOLNAME">  
                             <option>请选择学校</option>  
                         </select>  
                     </span>

    如果大家有更好的方式,希望可以交流一下经验,一起进步。

     
     
     注意:在做级联的时候,通常有AJAX和XML两种实现方式。
        如果数据是固定的,那么建议采用XML的方式进行操作,因为XML是一次加载,就不会重复的进行读取,比在数据库要有效率!
        但是如果是动态的数据,用户可以自由修改数据的,那么建议采用ajax 的方式,因为XML的读写是很消耗性能的,没有数据库的读写效率高,而且也不适合大量数据的频繁读写。
    乐于分享,共同进步 转载请注明出处,多谢! http://www.cnblogs.com/anhelida
  • 相关阅读:
    H264码流解析及NALU
    pflua:用Lua编写的高性能网络包过滤工具箱
    最新版FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用简介
    JNI和NDK的区别
    按两次回退键退出系统
    在当前界面停留几秒然后跳到另一个界面
    解决ScrollView 与ListView共存显示不完全的问题
    设置ListView每条数据之间的间隔
    通过布局文件来显示ListView内容并注册 ListView事件
    Android 改变标题栏的背景色
  • 原文地址:https://www.cnblogs.com/anhelida/p/3963951.html
Copyright © 2011-2022 走看看