关于Ajax的一揽子工程
--XML支持

  随着XML的日益流行,对XML的支持成为每一门高级语言都需要面对的问题。虽然JSON能在Javascript中以更高的效率和更少的资源表达数据,但XML这种世界语作为Javascript与其它语言(包括运行在服务端的语言)优秀解决方案仍被大量使用。而且在AJAX应用中,XML通常是服务端对客户端异步请求的响应形式。

如何支持XML?

跟以前一样,IE和Firefox有不同的实现方式:

var xmlDom = new ActiveXObject(“Microsoft.XmlDom”);

MSXML现在已经有五个不同的版本,所以工厂模式同样可用于XMLDOM的创建:

       function createDocument() {
            var aVersions = 
[ "MSXML2.DOMDocument.5.0",
                 "MSXML2.DOMDocument.4.0",
"MSXML2.DOMDocument.3.0",
                 "MSXML2.DOMDocument","Microsoft.XmlDom"];
 
            for (var i = 0; i < aVersions.length; i++) {
                try {
                    var oXmlDom = new ActiveXObject(aVersions[i]);
                    return oXmlDom;
                } catch (oError) {
                    //Do nothing
                } 
            }
            throw new Error("MSXML is not installed.");
        }
        var oXmlDom = createDocument();

创建XMLDOM之后,就可以使用它了:
oXmlDom.load("books.xml");或 oXmlDom.loadXML(“<root></root>”);
XMLDOM默认使用异步的方式载入,如要进行同步加载,则使用oXmlDom.async = false;来设置。
 既然XMLDOM可以以异步加载,所以我们又会见到类似这样的代码:

         oXmlDom.onreadystatechange = function () {
            if (oXmlDom.readyState == 4) {
            
                var oRoot = oXmlDom.documentElement;
                var oFirstBook = oRoot.firstChild;
                
                alert(oFirstBook.text);
            }
        };

和以前一样,4代表DOM完全载入。如果在载入数据时出现错语,则可以通过以下代码来处理:

         oXmlDom.onreadystatechange = function () {
            if (oXmlDom.readyState == 4) {
                if (oXmlDom.parseError.errorCode == 0) {
                    var cElements = oXmlDom.getElementsByTagName("*");
                    
                    alert(cElements.length + " elements in the document.");
                    
                } else {
                    alert("An Error Occurred: " + oXmlDom.parseError.reason);
                }
            }
        };

parseError对象有以下几个属性:
1. errorCode  -- 错误代码
2. line  -- 错误所在行
3. linepos -- 错误所在位置
4. reason  -- 对错误的一些说明
XMLDOM和HTMLDOM行为基本相似,除了HTML中的document换成documentElement。所以也可以使用firstChild,lastChild,childNodes等API。
 firefox则使用document.implementation来创建XMLDOM:

     var oXmlDom = document.implementation.createDocument("", "", null);
              
        oXmlDom.load("books.xml");
        oXmlDom.onload = function () {
            //Do something when the document is fully loaded.
        };

其中第一个参数为命名空间,第二个为标签名,第三个始终为null。在FireFox中,XMLDOM只能载入处部XML文件,而使用DOMParser对象来专门负责XML字符串的解析:

        var sXml = 
"<root><person><name>Jeremy McPeak</name></person></root>";
        var oParser = new DOMParser();

var oXmlDom = oParser.parseFromString(sXml,"text/xml");
 对载入XML内容后,和IE不同的是,FireFox中的DOM会触发load事件(参见上面代码)。
 如果加载发生错误,FireFox会返回一个XML格式的代码,我们需要对它进行分析,才能得到和IE类似的信息:

       var sXml = 
"<root><person><name>Jeremy McPeak</name></root>";
        var oParser = new DOMParser();
        var oXmlDom = oParser.parseFromString(sXml, "text/xml");
        
        if (oXmlDom.firstChild.tagName != "parsererror") {
            //No error occurred. Do something here.
        } else {
            var oXmlSerializer = new XMLSerializer();
            var sXmlError =
 oXmlSerializer.serializeToString(oXmlDom);
            var reError = />([\s\S]*?)Location:([\s\S]*?)Line Number (\d+), Column (\d+):<sourcetext>([\s\S]*?)(?:\-*\^)/;
            reError.test(sXmlError);            
            var str = "An error occurred!!\n" +
                "Description: " + RegExp.$1 + "\n" +
                "File: " + RegExp.$2 + "\n" +
                "Line: " + RegExp.$3 + "\n" +
                "Line Position: " + RegExp.$4 + "\n" +
                "Source Code: " + RegExp.$5;
            alert(str);
        }

如果需要反过来把XMLDOM转成字符串,IE提供一个很方便的属性来达到目的:
 var sXml = oXmlDom.xml;
 而在FireFox下要达到这一目的,要麻烦得多:
        function serializeXml(oNode) {
            var oSerializer = new XMLSerializer();
            return oSerializer.serializeToString(oNode);
        }
对XPath的支持
 IE对XPath的支持也是比较简便的,IE中的XML DOM对象的每个节点都可以直接使用selectNodes()和selectSingleNode()方法,这两个方法都接收一个XPath表达式作为参数。
 而FireFox对XPath的支持要难于使用得多,你需要使用到XPathEvaluator和XPathResult对象,并使用XPathEvaluator的evaluate()方法计算XPath表达式,evaluate()接收五个参数:XPath表达式,上下文节点,命名空间解释程序,返回类型:

    var sXPath = "na:book/pub:name";
    var oEvaluator = new XPathEvaluator();
    var oResult =
   oEvaluator.evaluate(sXPath,oXmlDom.documentElement,
nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);

var aNodes = new Array;

if (oResult != null) {
        var oElement;
        while (oElement = oResult.iterateNext()) {
            aNodes.push(oElement);
        }
    }

function nsResolver(sPrefix) {
        switch (sPrefix) {
            case "na":
                return "http://site1.com";
                break;
            case "pub":
                return "http://site2.com";
                break;
            default:
                return null;
                break;
        }
    }

很多情况下,XML并没有命名空间,所以对于nsResolver参数可以传入null。
对XSLT的支持
 在IE中同样可以清晰简单的使用XSLT:
oXmlDom.load("books.xml");
oXslDom.load("books.xsl");
ar sResults =
  oXmlDom.documentElement.firstChild.transformNode(oXslDom);
 任何一个XMLDOM节点都可以调用transformNode(oXslDom)获得转换后的结果。
 在FireFox中使用XSLT的方法如下:
  oXmlDom.load("books.xml");
  oXslDom.load("books.xsl");
       
  var oXsltProcessor = new XSLTProcessor();
  oXsltProcessor.importStylesheet(oXslDom);
       
  var oNewDom = oXsltProcessor.transformToDocument(oXmlDom);
小结
 本文简单讨论了在Javascript中如何操作XML。随着越来越火的RSS等XML应用,基于Javascript开发支持XML的程序将成为WEB程序员越来越重要的技能。
(未完待续……)

转载于:https://www.cnblogs.com/think/archive/2006/12/19/596985.html

关于Ajax的一揽子工程(2)相关推荐

  1. idea的一揽子工程

    我总觉得,世上如果人人都像我一样,那路该多难走.有时候在网上找到一些问题的答案,成功解决之后,就这么过去了,实在罪过. 将idea的几个常见的使用问题综合到一起吧,如果有不会用的,欢迎留言.当然,请支 ...

  2. ISC技术分享:从RASP开启云上应用安全防护

    在第十届互联网安全大会(ISC 2022)云安全发展峰会上,悬镜安全华东区技术合伙人周幸应主办方的特别邀请,发表了主题为"从RASP开启云上应用安全防护"的演讲. 图1 悬镜周幸在 ...

  3. 两天价网站背后重重迷雾:做个网站究竟要多少钱

    网友:功能并不复杂的政府网站,工会网670万元,孔子学院网3520多万元!难道这些网站都是纯金打造的? 地方信产厅官员:3520万元可以用100年. 资深建站人:这两个网站现有的建站成本只需6.5万元 ...

  4. 《电脑报》:两个天价网站背后迷雾

    网友:功能并不复杂的政府网站,工会网670万元,孔子学院网3520多万元!难道这些网站都是纯金打造的? 地方信产厅官员:3520万元可以用100年. 资深建站人:这两个网站现有的建站成本只需6.5万元 ...

  5. 淘淘商城(前台系统,展示商城首页,商品分类展示)

    1.前台系统和后台系统的关系 2.前台系统的搭建 3.服务端工程的搭建 3.1 创建工程 3.2 使用到的技术 3.3 配置工程 3.3.1 pom.xml 3.3.2 web.xml 3.3.3 框 ...

  6. 一个基于SAE Channel的综合应用--mobile web IM(1)

    2019独角兽企业重金招聘Python工程师标准>>> 关键词:Mobile IM, SAE Channel, JQM动态加载, 滚动刷新,设计模式,编程范式 Hi, 我是Leona ...

  7. SpringMVC-AJAX-PostgreSQL-cmcG

    SprngMVC-AJAX-PostgreSQL-cmcG 目录 该工程的下载地址... 文件目录截图 pom.xml文件内容 web.xml文件内容 jdbc.properties文件内容 MySq ...

  8. 一文聊透数字化转型,获得企业未来生存的入场券--童亚斋

    在不确定的大环境下,大家都希望能找到一些新的确定的正确的方向.最近和一些企业老板.CIO.CTO沟通,大家都把数字化转型作为了一个值得尝试和可以突破的方向.但是,对于数字化转型中的个中细节,各有各的理 ...

  9. Servlet学习DAY_02:重定向/ 文件上传/ Cookie和Session/ 导入一个工程 / 配置欢迎页面 / 同步请求和异步请求/JSON和AJax介绍 /过滤器

    重定向 重定向是服务器告诉客户端往指定的路径再次发出请求的指令 执行过程: 当服务器执行重定向方法时会给客户端返回302状态码和一个请求路径,浏览器接收到302后会立即往指定的路径再次发出请求 res ...

  10. vue工程全局设置ajax的等待动效

    最近在做vue的项目,使用了element-ui作为ui组件库,采用vuex进行状态管理,与后台的请求交互采用axios库实现,原本做的页面,ajax请求个数也只有三个,将等待动画的显示和隐藏通过mu ...

最新文章

  1. 免费直播:1小时带你体验Python车牌识别实战
  2. python安装过程中关机_1234567,Python帮女神自动来关机
  3. Noticaition 1.0 正式发布了
  4. 项目经理需要修炼的9件事
  5. 解决:MIUI 8应用商店下载不了软件 APP
  6. 鸿蒙开源小米能用吗,鸿蒙2.0开源,任何品牌都可以使用!小米用不用?
  7. Spring Boot零散知识总结
  8. 设置和开通freebsd远程登录
  9. 一、app更新提示后台接口开发-(2)数据库表设计
  10. 前端组件化和模块化最大的区别是什么_7招提升你的前端开发效率
  11. voxelnet_苹果最新机器学习论文:使用VoxelNet进行3D物体检测
  12. c1语言学生综合测评,学生综合素质评语
  13. maf相关代码和命令
  14. 中文文案排版指北(转自GitHub)
  15. java对中文首字母拼音排序
  16. 【周志华机器学习】线性模型
  17. 论文:EMNLP2021-End-to-End Entity Resolution and Question Answering Using Differentiable Knowledge Grap
  18. 计算机wlan打不开怎么回事,笔记本电脑wlan打不开怎么回事
  19. Prolific USB-to-Serial Comm Port在win8.1下
  20. 宝塔部署出现404 not found解决方法

热门文章

  1. 小视频app开发过程中关于转码问题的经验总结
  2. python全栈_010_Python3基本数据类型--元组
  3. BZOJ 1029: [JSOI2007]建筑抢修 优先队列
  4. Centos 下tomcat环境搭建
  5. rust socket 客户端例子
  6. Linux多网卡配置高级策略路由---从哪里来就回哪里去~!
  7. ubuntu下如何切换到root用户 --- 终端命令行方式
  8. Linux 基本网络配置
  9. ssh 本地转发 和远程转发 区别
  10. 阿里P8好友说,要想成为Java大佬,就得要多逛逛国外的这几个技术网站...