XML:使用DOM技术解析xML文件中的城市,实现select级联选择

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

中国的城市xml格式:cities.xml

  View Code

下面,使用DOM解析xML文件中的城市,实现select级联选择

最基本的方法:selecCity.html

复制代码
<!doctype html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>使用DOM解析city.xml,进行城市二级级联操作</title>


    <script type="text/javascript">
    //给加载页面绑定事件
    window.onload = function(){

        //从cities.xml文档中获取所有的#province节点
        //创建并添加所有的#province节点
        var provinceEle = document.getElementById('province');
        var xmlDoc = parseXML("cities.xml");
        provinceNodes = xmlDoc.getElementsByTagName('province');
        for (var i = 0; i < provinceNodes.length; i++) {
            var paraNode = provinceNodes[i].getAttributeNode("name");//属性节点
            var optionNode = document.createElement('option'); //创建省份province的option子节点
            optionNode.innerHTML = paraNode.nodeValue;
            provinceEle.appendChild(optionNode);
        };

        //为#province添加change响应事件
        provinceEle.onchange = function(){

            //先把#city节点除第一个子节点外都移除(注意:每清除一次,数组是变化的)
            var cityNode = document.getElementById('city');
            var optionNodes = cityNode.childNodes;
            var len = optionNodes.length;
            for (var i = 2; i <len; i++) {
                cityNode.removeChild(optionNodes[2]);
            }

            if(this.value == "请选择...")  return;

            //获取对应的所有#city节点
            for (var i = 0; i < provinceNodes.length; i++) {
                var paraNode = provinceNodes[i].getAttributeNode("name");//属性节点
                if (paraNode.nodeValue == this.value) {

                    //接着获取每一个#province对应的#city节点
                    var allsubTextNodes = provinceNodes[i].childNodes;
                    for (var k = 0; k < allsubTextNodes.length; k++) { 
                        var optionNode = document.createElement('option');//创建城市city的option子节点
                        optionNode.innerHTML = allsubTextNodes[k].firstChild.nodeValue;
                        cityNode.appendChild(optionNode);
                    }
                }
            }
        }    

            //创建XML解析器
        function parseXML(xmlFile){
           try //Internet Explorer---ie浏览器的解析器创建方式如下:
           {
                xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
           }
           catch (e) {
                try //Firefox, Mozilla, Opera, etc. 火狐等浏览器的创建方式。
                {
                     xmlDoc = document.implementation.createDocument("", "", null);
                }
                catch (e) 
                {   
                     alert(e.message);
                     return;   //如果创建不成功,就直接返回,不往下走。
                }
           }
           if(xmlDoc!=null){
                xmlDoc.async = false;
                xmlDoc.load(xmlFile);
           }
           return xmlDoc;   //返回创建好的解析器,传给调用者。
        }
    }
    </script>

</head>
<body>
    中国城市二级级联选择<br>
    <select id="province">
        <option>请选择...</option>
    </select>
    <select id="city">
        <option>请选择...</option>
    </select>
</body>
</html>        
复制代码

其实,还有一个更简单的方法,使用XPath技术,下面的实现效果是一样哟:selecCity2.html

复制代码
<!doctype html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>使用DOM解析city.xml,进行城市二级级联操作</title>


    <script type="text/javascript">
    //给加载页面绑定事件
    window.onload = function(){

        //从cities.xml文档中获取所有的#province节点
        //创建并添加所有的#province节点
        var provinceEle = document.getElementById('province');
        var xmlDoc = parseXML("cities.xml");
        var xmlPath = "/china/province" //获取所有的#province属性节点
        var allProvinces = returnNodes(xmlDoc,xmlPath);
        alert(allProvinces.length);

        alert(returnNodes(xmlDoc,xmlPath).length);

        for (var i = 0; i < allProvinces.length; i++) {
            var nameNode = allProvinces[i].getAttributeNode("name");//属性节点
            var optionNode = document.createElement('option'); //创建省份province的option子节点
            optionNode.innerHTML = nameNode.nodeValue;
            provinceEle.appendChild(optionNode);
        };
        
        //为#province添加change响应事件
        provinceEle.onchange = function(){

            //先把#city节点除第一个子节点外都移除(注意:每清除一次,数组是变化的)
            var cityNode = document.getElementById('city');
            var cityOptions = cityNode.childNodes;
            var len = cityOptions.length;
            for (var i = 2; i <len; i++) {
                cityNode.removeChild(cityOptions[2]);
            }

            //省份没有选择,直接不执行下面的语句
            if (this.value == "请选择...") return;

            //获取#province对应下的所有子节点#city
            xmlPath = "//province[@name='"+this.value+"']"
            var optionNodes = returnNodes(xmlDoc,xmlPath);
            var cityNodes = optionNodes[0].childNodes;
            for (var i = 0; i < cityNodes.length; i++) {
                var optionNode = document.createElement('option');//创建城市city的option子节点
                optionNode.innerHTML = cityNodes[i].firstChild.nodeValue;
                cityNode.appendChild(optionNode);
            }
        }    

           //创建XML解析器
        function parseXML(xmlFile){

           try //Internet Explorer---ie浏览器的解析器创建方式如下:
           {
                xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
           }
           catch (e) {
                try //Firefox, Mozilla, Opera, etc. 火狐等浏览器的创建方式。
                {
                     xmlDoc = document.implementation.createDocument("", "", null);
                }
                catch (e) 
                {   
                     alert(e.message);
                     return;   //如果创建不成功,就直接返回,不往下走。
                }
           }
           if(xmlDoc!=null){
                xmlDoc.async = false;
                xmlDoc.load(xmlFile);
           }
           return xmlDoc;   //返回创建好的解析器,传给调用者。
        }

         //使用XPath技术获取所有的元素节点
         function returnNodes(xmlDoc,xmlPath) {
             // code for IE
            if (window.ActiveXObject)
            {
                return xmlDoc.selectNodes(xmlPath);
            }
            // code for Mozilla, Firefox, Opera, etc.
            else if (document.implementation && document.implementation.createDocument)
            {
                return xmlDoc.evaluate(xmlPath, xmlDoc, null, XPathResult.ANY_TYPE,null);
            }
         }
    }
    </script>

</head>
<body>
    中国城市二级级联选择<br>
    <select id="province">
        <option>请选择...</option>
    </select>
    <select id="city">
        <option>请选择...</option>
    </select>
</body>
</html>
复制代码

拓展:判断浏览器类型,这儿还给出判断一个浏览器的方法:

复制代码
//判断浏览器
function myBrowser(){
     //取得浏览器的userAgent字符串
     var explorer = window.navigator.userAgent ; 
     //iE
     if (explorer.indexOf("MSIE") > -1 && explorer.indexOf("compatible") > -1 && !explorer.indexOf("Opera")) { 
           return "IE";
     }
     //firefox 
     else if (explorer.indexOf("Firefox") > -1) {
           return "Firefox";
     }
     //Chrome
     else if(explorer.indexOf("Chrome") > -1){
           return "Chrome";
     }
     //Opera
     else if(explorer.indexOf("Opera") > -1){
           return "Opera";
     }
     //Safari
     else if(explorer.indexOf("Safari") > -1){
           return "Safari";
     }
}
复制代码

 

效果图显示:

 

 

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!
本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/5871439.html ,如需转载请自行联系原作者
相关文章
|
5天前
|
运维 监控 安全
运维技术——从基础到高阶的全面解析
本文是一篇技术性文章,主要探讨了运维技术。运维不仅仅是保持系统的稳定运行,更包括优化、预防故障和应对突发事件的能力。本文将从运维的基本概念入手,逐步深入到高阶技术和策略,为读者提供一个全面的运维知识体系。希望通过这篇文章,读者能够更好地理解和应用运维技术,提升自己的运维能力。
|
10天前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
55 2
|
3天前
|
存储 应用服务中间件 云计算
深入解析:云计算中的容器化技术——Docker实战指南
【10月更文挑战第14天】深入解析:云计算中的容器化技术——Docker实战指南
14 1
|
5天前
|
机器学习/深度学习 编解码 算法
深入解析MaxFrame:关键技术组件及其对视频体验的影响
【10月更文挑战第12天】随着流媒体服务和高清视频内容的普及,用户对于视频质量的要求越来越高。为了满足这些需求,许多技术被开发出来以提升视频播放的质量。其中,MaxFrame是一种旨在通过一系列先进的图像处理算法来优化视频帧的技术。本文将深入探讨构成MaxFrame的核心组件,包括运动估计、超分辨率重建以及时间插值算法,并讨论这些技术如何协同工作以改善视频播放效果。
11 1
|
8天前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
11天前
|
JavaScript 前端开发 算法
React 虚拟 DOM 深度解析
【10月更文挑战第5天】本文深入解析了 React 虚拟 DOM 的工作原理,包括其基础概念、优点与缺点,以及 Diff 算法的关键点。同时,分享了常见问题及解决方法,并介绍了作者在代码/项目上的成就和经验,如大型电商平台的前端重构和开源贡献。
25 3
|
10天前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
4天前
|
开发框架 JavaScript 前端开发
Electron技术深度解析:构建跨平台桌面应用的利器
【10月更文挑战第13天】Electron技术深度解析:构建跨平台桌面应用的利器
20 0

推荐镜像

更多