浅谈关于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
原文地址:https://www.cnblogs.com/anhelida/p/3963951.html