admin 管理员组文章数量: 1087139
2024年4月19日发(作者:hive insert into语法)
维普资讯
・72・ (总698) 跨浏览器的XML接口的实现 2007盔
跨浏览器的XML接口的实现
广州大学 陈畅频 郭四稳
XML是从SGML衍生出来的通用 技术。创建XML文档的标准方式由D0M
return new ActiveXObject
x()+ .XmlHttp );}}
mplementation
(getC0ntr0lPrefi
标记语言,是创建标记语言的元语言。
级别2引入,它使用DOMI
eateDocument方法。
XML结构化地表示信息,并支持网络跨
接口的cr
catch(ex){)
平台应用和数据交换。
document.implementation.createDoc
throw new Error(”您的浏览器不支
fiedName,
持XmlHttp对象 ););
文档对象模型(Document Object
ument(sNameSpaceUri,sQuali
Model,D0M)定义了访问和操作XML文
oDoctype);
如果将来Mozilla本身提供了对
档的标准方式,是操纵XML的最常用工
这样就创建了一个XmlDocument对
onreadystatechange事件的支持,则上述
具之一。由DOM创建的节点树是XML
文件内容的逻辑表示,它显示了文件提供
的信息以及他们之间的关系。DOM现在
不仅内置于Web浏览器,而且也成为许
多基于XML的规范的一部分。
XmlHttp提供客户端同http服务器
通讯的协议。客户端可以通过XmlHttp对
象向http服务器发送请求并使用DOM
处理回应。现在的绝对多数浏览器都增加
了对XmlHttp的支持,IE中使用
ActiveXObject方式创建XmlHttp对象,
其他浏览器:如Mozilla通过Firefox、
Opera等通过window.XMLHttpRequest
来创建XmlHttp对象。
本文将详细讲述在IE和Mozilla中
如何创建XmloDcument对象和XmlHttp
对象来操纵XML并同HTTP服务器交
互。
l浏览器对XML的支持
1.1 IE对XML的支持
有两个被标记成脚本安全的ActiveX
对象可以在IE中使用。这些对象使用
MSXML解析器,创建方法如下:
var xmlDocument — new
ActiveXObject(“MsXml2.XmlDom”);
var xmlHttp-二new ActiveXObject
(“MsXml2.XmlHttp”);
第一个对象代表XML文档,它允许
你使用标准的DOM1核心方法向文档添
加新的结点。该对象也提供了另外一些方
法来支持从文件或字符串装入(获取)
XML文档。
第二个对象允许将XML文档发送到
服务器,且来自服务器的回复也会发回到
该XML HTTP请求对象。这使得不需要
离开当前页面就可以发送XML数据到服
务器。
1.2 Mozilla对XML的支持
Mozilla尽可能使用与W3C兼容的
象并且可以用使用Mozilla支持的任何 的静态方法将只检查浏览器支持并使用
D0M(级别1、2和3)方法。
浏览器支持的机制来创建所需的对象实
下面是一个最简单的例子 例。如果当前版本的Mozilla不支持
document.implementation.createDo
readyState属性,则也一定不支持
cument(…,,… ,nul1);
onreadystatechange事件,于是需要监听
Mozilla支持XMLHttpRequest对
onload事件并且在事件发生时调用用户
象。下面的代码用于创建XML http请求
提供的处理器(如果有的话)。
对象。
2.2 XmlDocument
new XMLHttpRequest()
function XmlDocument(){}
2通用的XML接口
XmlDocument.create—function()
为了方便在不同的浏览器中使用
{
XML,这里创建两个工厂类,分别叫做
try{
XmlHttp和XmlDocument。这两个类都有
if(document.implementation
名为create的静态方法(类方法,共享方
&&
法),它创建正确类型的实例对象。
document.implementation.createDocume
var xmlDocument —
nt)
XmlDocument.create();
{
var xmlHttp=XmlHttp.create();
var doc 二-
2.1 XmlHttp
document.implementation.createDocume
function XmlHttp(){}
nt( , ,nul1);
XmlHttp.create-二function(){
if(doc.readyState-二-二nul1)
try{
{
if(window.XMLHttpRequest)
doc.readyState-二1:
{
doc.addEventListener(
var req 二。 new
load 。function(){
XMLHttpRequest();
doc.readyState一4;
if(req.readyState-二-二nul1)
if (typeof
{
doc.onreadystatechange-二-二 function )
req.readyState一1:
req.addEventListener‘(
doc.onreadystatechange();
load ,function(){
),false);)
req.readyState-二4:
return doc;)
if (typeof
if(window.ActiveXObject)
req.onreadystatechange一-二 function )
return new ActiveXObject
(getContro1Prefix()+”.XmloDm );)
req.onreadystatechange();
catch(ex){)
),false);)
throw new Error(”您的浏览器不支
return req;}
持XmlDocument对象”););
if(window.ActiveXObject){
为了支持onreadystatechange事件,
维普资讯
第2O卷第9期 电脑开发与应用
这里也做了一些额外的处理。但除此之 //将字符串解析成新的文档
定采用异步还是同步方式。异步方式下客
外,create方法的实现应当是很直观的。
var doc2一(new DOMParser())
户端不需要等待服务器的响应,而是由浏
2.3 getControlPrefix
.
parseFromString(s,”text/xml”);
览器在有响应时自动调用指定的回调函
不同版本的IE和Windows安装了不 //删除所有原来的子元素 数(如这里的doSomething)。
同版本的MSXML解析器,因此需要创建
while(this.hasChildNodes())
②使用同步XmlHttp
一
个帮助函数来检测对用户所用IE版本
this.removeChild
同步方式更容易使用,因为在服务器
起作用的控件的前缀。这个函数试着一次
(this.1astChild);
做出响应之前对send的调用不会返回,
性创建“XmlHttp”和“XmlDom”两个
??插入并导人结
而且浏览器在此期间也不会做其它事情。
ActiveX对象,并且一发现起作用的前缀
for (var i 一0; i <
如果希望使用同步方式,则需要将open
就记录下来,以避免重试。如果没有发现
doc2.childNodes.1ength;i++){
的第3个参数设置成false。一旦send方
有效的控件前缀则抛出异常。版本无关的
this.appendChild
法调用完毕,就可以访问responseXML
控件前缀是“MSXML2”,这也是首先要测
(this.importNode(doc2.childNodes[i],
属性了。
试的前缀。在它之后,其他一些前缀也被
true));));
function loadSync(sUri)f
测试。 Mozilla版本的XML文档缺少的
var xmlHttp—XmlHttp-create
function getContro1Prefix(){
一
个更重要的特性是将D0M树串行化
();
if(getContro1Prefix.prefix)
成XML字符串。幸运的是,可以使用名为
xmlHttp.open(”GET”,sUri,
return getContro1Prefix.prefix;
XMLSerializer的类来做此事。在IE中,
false);
var prefixes—r”MSXML2”。”
XML文档有一个名为xml的属性,它将
xmlHttp.send(nul1);
Microsoft”,”MSXML”,”MSXML3"];
DOM树串行化成XML字符串,于是在
doS0mething
var 0,02;
Document.prototype上定义一个返回
(xmlHttp.responseXML ); //
for (var i 一0; i <
XML字符串的获取器。
responseXML:XmlDocument)
prefixes.1ength;i++){
Document.prototype.
3.2发送XML文档
try{
defineGetter
(”xml”,function(){
这里依然使用XmlHttp对象发送
//试着创建对象
return(new XMLSerializer())
XML文档到服务器,只需要将
0一new ActiveXObject
.
seria1izeToString(this);));
XmlDocument作为参数传递给send方法
(prefixes[i]+ .XmlHttp ;
3使用XML接口
即可。
02一new ActiveXObject
这里介绍使用在上面定义的XML
function postAsync(sUri,xmlDoc){
(prefixes Eli+”.XmlDom );
接口的方法、
var xmlHttp—XmlHttp.create
return
3.1请求XML文档
();
getcontro1Prefix.prefix—prefixes E1];
使用异步XmlHttp
xmlHttp.open(”GET”,sUri,
)
从服务器请求XML文档既可以使
true);
catch(ex){);)
用XmlHttpt对象也可以使用
xmlHttp.onreadystatechange =
throw new Error(”找不到已安装的
XmlDocument对象。一般使用第1个对
function(){
XML解析器”);)
象,因为它的功能更强大一些。
if(xmlHttp.readyState=一4)
2.4扩展Mozilla对XML的支持
function loadAsync(sUri){
doSomething
希望在对象XmlDocument上使用名
var xmlHttp=XmlHttp.create
(xmlHttp.responseXML ); //
为loadXML的方法,该方法以一个字符
();
responseXML:XmlDocument)
串为参数并将它解析成XML。Mozilla版
xmlHttp.open( GET ,sUri,
xmlHttp.send(xmlDoc);)
本的XmlDocument本身不支持这个方
true);
4结束语
法,于是需要扩展Document的
xmlHttp.onreadystatechange==
在浏览器中操纵XML文档以及从
prototype。在Mozilla中解析XML字符
function()f
(向)服务器读取(发送)XML文档是
串可以使用内置在DOMParser对象中的
if(xmlHttp.readyState一一4)
AJAx技术的核心部分,但目前还未成为
方法。
doSomething
W3C的标准。IE和Mozilla是目前用得最
要从XML字符串装入文档,首先要
(xmlHttp.responseXML ); //
多的两种浏览器,前者通过ActiveX控件
解析该字符串,然后删除原始树中的所有
responseXML:XmlDocument
支持XML且功能强大,后者对XML的
结点并插入从已解析的字符串得到的文
)
支持是原生的但功能不够完善。为了方便
档中的所有结点。
xmlHttp.send(nul1);)
开发web应用,本文对IE和Mozilla中
Document.prototype.1oadXML —
open方法带3个参数,第1个参数取
的XML对象进行了封装,实现了一个跨
function(s)(
值为“GET”或“POST”。最后一个参数决 浏览器的XML接口。
版权声明:本文标题:跨浏览器的XML接口的实现 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/b/1713491006a637324.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论