关于Ajax的一揽子工程(2)
关于Ajax的一揽子工程
--XML支持
随着XML的日益流行,对XML的支持成为每一门高级语言都需要面对的问题。虽然JSON能在Javascript中以更高的效率和更少的资源表达数据,但XML这种世界语作为Javascript与其它语言(包括运行在服务端的语言)优秀解决方案仍被大量使用。而且在AJAX应用中,XML通常是服务端对客户端异步请求的响应形式。
如何支持XML?
跟以前一样,IE和Firefox有不同的实现方式:
MSXML现在已经有五个不同的版本,所以工厂模式同样可用于XMLDOM的创建:
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可以以异步加载,所以我们又会见到类似这样的代码:
if (oXmlDom.readyState == 4) {
var oRoot = oXmlDom.documentElement;
var oFirstBook = oRoot.firstChild;
alert(oFirstBook.text);
}
};
和以前一样,4代表DOM完全载入。如果在载入数据时出现错语,则可以通过以下代码来处理:
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:
oXmlDom.load("books.xml");
oXmlDom.onload = function () {
//Do something when the document is fully loaded.
};
其中第一个参数为命名空间,第二个为标签名,第三个始终为null。在FireFox中,XMLDOM只能载入处部XML文件,而使用DOMParser对象来专门负责XML字符串的解析:
"<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类似的信息:
"<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 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)相关推荐
- idea的一揽子工程
我总觉得,世上如果人人都像我一样,那路该多难走.有时候在网上找到一些问题的答案,成功解决之后,就这么过去了,实在罪过. 将idea的几个常见的使用问题综合到一起吧,如果有不会用的,欢迎留言.当然,请支 ...
- ISC技术分享:从RASP开启云上应用安全防护
在第十届互联网安全大会(ISC 2022)云安全发展峰会上,悬镜安全华东区技术合伙人周幸应主办方的特别邀请,发表了主题为"从RASP开启云上应用安全防护"的演讲. 图1 悬镜周幸在 ...
- 两天价网站背后重重迷雾:做个网站究竟要多少钱
网友:功能并不复杂的政府网站,工会网670万元,孔子学院网3520多万元!难道这些网站都是纯金打造的? 地方信产厅官员:3520万元可以用100年. 资深建站人:这两个网站现有的建站成本只需6.5万元 ...
- 《电脑报》:两个天价网站背后迷雾
网友:功能并不复杂的政府网站,工会网670万元,孔子学院网3520多万元!难道这些网站都是纯金打造的? 地方信产厅官员:3520万元可以用100年. 资深建站人:这两个网站现有的建站成本只需6.5万元 ...
- 淘淘商城(前台系统,展示商城首页,商品分类展示)
1.前台系统和后台系统的关系 2.前台系统的搭建 3.服务端工程的搭建 3.1 创建工程 3.2 使用到的技术 3.3 配置工程 3.3.1 pom.xml 3.3.2 web.xml 3.3.3 框 ...
- 一个基于SAE Channel的综合应用--mobile web IM(1)
2019独角兽企业重金招聘Python工程师标准>>> 关键词:Mobile IM, SAE Channel, JQM动态加载, 滚动刷新,设计模式,编程范式 Hi, 我是Leona ...
- SpringMVC-AJAX-PostgreSQL-cmcG
SprngMVC-AJAX-PostgreSQL-cmcG 目录 该工程的下载地址... 文件目录截图 pom.xml文件内容 web.xml文件内容 jdbc.properties文件内容 MySq ...
- 一文聊透数字化转型,获得企业未来生存的入场券--童亚斋
在不确定的大环境下,大家都希望能找到一些新的确定的正确的方向.最近和一些企业老板.CIO.CTO沟通,大家都把数字化转型作为了一个值得尝试和可以突破的方向.但是,对于数字化转型中的个中细节,各有各的理 ...
- Servlet学习DAY_02:重定向/ 文件上传/ Cookie和Session/ 导入一个工程 / 配置欢迎页面 / 同步请求和异步请求/JSON和AJax介绍 /过滤器
重定向 重定向是服务器告诉客户端往指定的路径再次发出请求的指令 执行过程: 当服务器执行重定向方法时会给客户端返回302状态码和一个请求路径,浏览器接收到302后会立即往指定的路径再次发出请求 res ...
- vue工程全局设置ajax的等待动效
最近在做vue的项目,使用了element-ui作为ui组件库,采用vuex进行状态管理,与后台的请求交互采用axios库实现,原本做的页面,ajax请求个数也只有三个,将等待动画的显示和隐藏通过mu ...
最新文章
- 免费直播:1小时带你体验Python车牌识别实战
- python安装过程中关机_1234567,Python帮女神自动来关机
- Noticaition 1.0 正式发布了
- 项目经理需要修炼的9件事
- 解决:MIUI 8应用商店下载不了软件 APP
- 鸿蒙开源小米能用吗,鸿蒙2.0开源,任何品牌都可以使用!小米用不用?
- Spring Boot零散知识总结
- 设置和开通freebsd远程登录
- 一、app更新提示后台接口开发-(2)数据库表设计
- 前端组件化和模块化最大的区别是什么_7招提升你的前端开发效率
- voxelnet_苹果最新机器学习论文:使用VoxelNet进行3D物体检测
- c1语言学生综合测评,学生综合素质评语
- maf相关代码和命令
- 中文文案排版指北(转自GitHub)
- java对中文首字母拼音排序
- 【周志华机器学习】线性模型
- 论文:EMNLP2021-End-to-End Entity Resolution and Question Answering Using Differentiable Knowledge Grap
- 计算机wlan打不开怎么回事,笔记本电脑wlan打不开怎么回事
- Prolific USB-to-Serial Comm Port在win8.1下
- 宝塔部署出现404 not found解决方法
热门文章
- 小视频app开发过程中关于转码问题的经验总结
- python全栈_010_Python3基本数据类型--元组
- BZOJ 1029: [JSOI2007]建筑抢修 优先队列
- Centos 下tomcat环境搭建
- rust socket 客户端例子
- Linux多网卡配置高级策略路由---从哪里来就回哪里去~!
- ubuntu下如何切换到root用户 --- 终端命令行方式
- Linux 基本网络配置
- ssh 本地转发 和远程转发 区别
- 阿里P8好友说,要想成为Java大佬,就得要多逛逛国外的这几个技术网站...