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

简介:

中国的城市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 ,如需转载请自行联系原作者
相关文章
|
4月前
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
|
10月前
|
XML JavaScript 数据格式
XML 相关技术
XML 相关技术
|
11月前
|
XML 前端开发 Java
讲解SSM的xml文件
本文详细介绍了SSM框架中的xml配置文件,包括springMVC.xml和applicationContext.xml,涉及组件扫描、数据源配置、事务管理、MyBatis集成以及Spring MVC的视图解析器配置。
219 1
|
10月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
335 5
|
10月前
|
Java Maven
maven项目的pom.xml文件常用标签使用介绍
第四届人文,智慧教育与服务管理国际学术会议(HWESM 2025) 2025 4th International Conference on Humanities, Wisdom Education and Service Management
780 8
|
10月前
|
XML Android开发 数据格式
Eclipse 创建 XML 文件
Eclipse 创建 XML 文件
137 2
|
11月前
|
XML JavaScript Java
java与XML文件的读写
java与XML文件的读写
143 3
|
6月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
572 29
|
6月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
174 4
|
6月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~