收藏本页 | 网站地图 | 投稿指南
 
 
当前位置:首页 >> 学院首页 >> 网页设计 >> JavaScript >>

javascript 中的 XMLDOM 对象 精华

放大字体  缩小字体  At: 2008-09-18 14:46  来源: 互联网

一 IE中的XML DOM
1.微软通过ActiveX的MSXML库提供了支持,通过:

 var oXmlDom = ew ActiveXObject("MSXML2.DOMDocument.5.0")

得到一个XML DOM对象,这是在IE6中的,如果你的IE是更老版本的,可以使用下面的函数得到,如果你没有安装MSXML,将不能得到:

 functio createXMLDOM() {
 
 var arrSignature = ["MSXML2.DOMDocument.5.0", quot;MSXML2.DOMDocument.4.0",
 quot;MSXML2.DOMDocument.3.0", quot;MSXML2.DOMDocument",
 quot;Microsoft.XmlDom"];
 
 for (var i=0 i lt arrSignatures.length i++) {
 try {
 
 var oXmlDom = ew ActiveXObject(arrSignatures[i]);
 
 retur oXmlDom;
 
 } catch (oError) {
 //ignore
 }
 } 
 
 throw ew Error("你的系统没有安装MSXML") 
 } 


当然,如果你使用prototype库,可以使用Try.these函数。

2.XML DOM对象可以通过load和loadXML方法载入xml文件或者字符串:

  oXmlDom.load("test.xml");
  oXmlDom.loadXML(" lt;root> lt;/root> quot;);

然后这个oXmlDom就可以使用所有的DOM对象方法,比如documentElement.tagName,参见:
 《javascript之DOM技术(一)》
 《javascript之dom技术(二)》

3.XML DOM默认是通过异步载入xml文件的,可以通过设置async值来选择是同步还是异步:
< an style="color: rgb(0,0,0)">oXmlDom.async=true;

4.IE的XML DOM拥有一个readyState值用来表示载入文件的状态:

0&mdash mdash;准备载入
1&mdash mdash;正在载入
2&mdash mdash;载入完成
3&mdash mdash;载入完成并可用,但有一部分数据也许不可用
4&mdash mdash;完全载入,完全可用。

相应的有一个onreadystatechange事件,当状态改变时发生,我们可以通过监听此事件来判断XML DOM对象的可用性

oXmlDom.onreadystatechange = functio () {
 if (oXmlDom.readyState == 4) {
 alert("load test.xml done!");
 alert("Tag ame of the root element i quot + oXmlDom.documentElement.tagName);
 alert("The root element ha thi many children: quot + oXmlDom.documentElement.childNodes.length);

 }
 };


5.IE的XML DOM对象有一个xml属性,用来返回xml文件的字符串形式,比如

oXmlDom.async=false;
oXmlDom.load("test.xml");
alert(oXmlDom.xml);


alert出:<root> lt;child/> lt;child/> lt;/root>

6.IE,当载入的XML文件或者字符串解析错误时,将产生一个parseError对象,我们在下面的代码中演示此对象的属性:

  oXmlDom.async = false;
 oXmlDom.load("errors.xml");
 
 //0表示没有错误
 if (oXmlDom.parseError != 0) {
 var oError = oXmlDom.parseError;
 
 alert("A error occurred:\n错误代码: quot;
 + oError.errorCode + quot;\ quot;
 + quot;行数: quot + oError.line + quot;\ quot;
 + quot;列数: quot + oError.linepo + quot;\ quot;
 + quot;原因: quot + oError.reason);
 
 }



二.Mozilla的XML DOM对象
1.XML DOM对象的创建,符合DOM标准的,通过document.implementation.createDocument()方法。比如:

var oXmlDom=document.implementation.createDocument(" quot;," quot;,null);


这三个参数分别是文档命名空间、文档元素的标签名以及一个文档类型对象(总为null),比如:

var oXmlDom=document.implementation.createDocument("http://www.rubyeye.net","root",null);


这段代码创建了一个<a0:root xml ="http://www.rubyeye.net"/>的XML DOM对象


2.载入xml,Mozilla与IE不同的是只提供了一个load()方法用于载入xml文件,没有提供loadXML()方法用于载入XML字符串。同步载入XML文件的代码与IE相同:

oXmlDom.async=false;
oXmlDom.load("test.xml");


异步载入稍有不同,因为Mozilla并不支持readyState属性,并且没有onreadystatechange事件,它只有一个onload的事件,当载入完成时触发;或者说相当于IE的readyState属性等于4的状态。

oXmlDom.onload=function(){
alert("done");
}
oXmlDom.load("test.xml");


要将XML字符串解析为DOM对象,必须使用DOMParser对象:

var oParser=new DOMParser();
var oXmlDom=oParser.parseFromString(" lt;root> lt;child/> lt;/root>,"text/xml");


两个参数:要解析的XML字符串以及字符串的内容类型(只能为text/xml或者a lication/xml)。
不过我们可以实现自己的loadXML方法:

 Document.prototype.loadXML = functio (sXml) {
 
 var oParser = ew DOMParser();
 var oXmlDom = oParser.parseFromString(sXml, quot;text/xml");
 
 //删除原文档内容
 while (this.firstChild) {
 this.removeChild(this.firstChild);
 }
 //导入新的文档内容
 for (var i=0 i lt oXmlDom.childNodes.length i++) {
 var oNewNode = this.importNode(oXmlDom.childNodes[i], true);
 this.a endChild(oNewNode);
 }
 
 };


3.Mozilla没有提供IE的xml属性来返回XML文档内容,只能通过使用XMLSerializer对象:

var oSerializer=new XMLSerializer();
var Xml=oSerializer.serializeToString(oXmlDom,"text/xml");

同样两个参数:XML DOM对象以及转化成的文档类型。

同样,我们也可以给Mozilla的XML DOM对象定义一个属性xml,通过defineGetter方法:

Node.prototype.__defineGetter__("xml",function(){
var oSerializer=new XMLSerializer();
var Xml=oSerializer.serializeToString(this,"text/xml");
});


以后就可以以IE的方式,oXmlDom.xml来获取XML文档内容。

4。错误处理,同样与IE不同,Mozilla当解析错误时会返回一段代码,以标签< rasereoor>包括其中的代码解释了错误发生的原因以及位置等信息,我们只有通过正则表达式解析此段代码,提取错误信息。

  var reError = />([\s\S]*?)Location:([\s\S]*?)Line umber (\d+), Colum (\d+):< ourcetext>([\s\S]*?)(?:\-*\^)/;
 
 //返回代码的标签名为parsererror,表示错误发生
 if (oXmlDom.documentElement.tagName == quot arsererror") {
 reError.test(oXmlDom.xml);
 alert("A error occurred:\n描述: quot;
 + RegExp.$1 + quot;\ quot;
 + quot;文件名: quot + RegExp.$2 + quot;\ quot;
 + quot;行数: quot + RegExp.$3 + quot;\ quot;
 + quot;列数: quot + RegExp.$4 + quot;\ quot;
 + quot;原因: quot + RegExp.$5);
 }


三,提供一个跨浏览器的XML DOM对象解决方案,来自于《javascript高级程序设计》


functio XmlDom() {
 //通过对象/属性检测法,判断是IE来是Mozilla
 if (window.ActiveXObject) {
 var arrSignature = ["MSXML2.DOMDocument.5.0", quot;MSXML2.DOMDocument.4.0",
 quot;MSXML2.DOMDocument.3.0", quot;MSXML2.DOMDocument",
 quot;Microsoft.XmlDom"];
 
 for (var i=0 i lt arrSignatures.length i++) {
 try {
 
 var oXmlDom = ew ActiveXObject(arrSignatures[i]);
 
 retur oXmlDom;
 
 } catch (oError) {
 //ignore
 }
 } 

 throw ew Error("MSXML i ot i talled o your ystem.") 
 
 //同上 
 } else if (document.implementatio am am document.implementation.createDocument) {
 
 var oXmlDom = document.implementation.createDocument(" quot;," quot;,null);

 //创建Mozilla版本的parseError对象
 oXmlDom.parseError = {
 valueOf: functio () { retur this.errorCode },
 toString: functio () { retur this.errorCode.toString() }
 };
 
 //初始化parseError对象
 oXmlDom.__initError__();
 
 
 oXmlDom.addEventListener("load", functio () {
 this.__checkForErrors__();
 this.__changeReadyState__(4);
 }, false);

 retur oXmlDom 
 
 } else {
 throw ew Error("Your rowser doe 't u ort a XML DOM object.");
 }
}

//此处用到了该书中一个浏览器系统检测js文件,如果是Mozilla
if (isMoz) {

 Document.prototype.readyState = 0;
 Document.prototype.onreadystatechange = ull;

 
 Document.prototype.__changeReadyState__ = functio (iReadyState) {
 this.readyState = iReadyState;

 if (typeof this.onreadystatechange == quot;functio quot;) {
 this.onreadystatechange();
 }
 };
 //初始化parseError对象
 Document.prototype.__initError__ = functio () {
 this.parseError.errorCode = 0;
 this.parseError.filepo = -1;
 this.parseError.line = -1;
 this.parseError.linepo = -1;
 this.parseError.reaso = ull;
 this.parseError.srcText = ull;
 this.parseError.url = ull;
 };
 
 Document.prototype.__checkForErrors__ = functio () {

 if (this.documentElement.tagName == quot arsererror") {

 var reError = />([\s\S]*?)Location:([\s\S]*?)Line umber (\d+), Colum (\d+):< ourcetext>([\s\S]*?)(?:\-*\^)/;

 reError.test(this.xml);
 
 this.parseError.errorCode = -999999;
 this.parseError.reaso = RegExp.$1;
 this.parseError.url = RegExp.$2;
 this.parseError.line = arseInt(RegExp.$3);
 this.parseError.linepo = arseInt(RegExp.$4);
 this.parseError.srcText = RegExp.$5;
 }
 };
 
 //定义Mozilla的loadXML方法 
 Document.prototype.loadXML = functio (sXml) {
 
 this.__initError__();
 
 this.__changeReadyState__(1);
 
 var oParser = ew DOMParser();
 var oXmlDom = oParser.parseFromString(sXml, quot;text/xml");
 
 while (this.firstChild) {
 this.removeChild(this.firstChild);
 }

 for (var i=0 i lt oXmlDom.childNodes.length i++) {
 var oNewNode = this.importNode(oXmlDom.childNodes[i], true);
 this.a endChild(oNewNode);
 }
 
 //载入后检查错误
 this.__checkForErrors__();
 
 //没有问题,设置readyState属性为4
 this.__changeReadyState__(4);

 };
 
 Document.prototype.__load__ = Document.prototype.load;

 Document.prototype.load = functio (sURL) {
 this.__initError__();
 this.__changeReadyState__(1);
 this.__load__(sURL);
 };
 
 ode.prototype.__defineGetter__("xml", functio () {
 var oSerializer = ew XMLSerializer();
 retur oSerializer.serializeToString(this, quot;text/xml");
 });

}
 






         









 
Google
论坛精华  
 
 
  ©2005-2008 站长吧 Master8.NET All Rights Reserved 陕ICP备05010609号