- 浏览: 200810 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
nenyalanye_1:
没用过 下下来研究研究!
JSDT-Eclipse下的Javascript调试插件 -
noahweb:
datas = new BO.Datas();
entryA ...
Easyb初体验 -
noahweb:
easyb 如何定义一个list?结构如下,如果对BO.Dat ...
Easyb初体验 -
elemark:
很有用,受教了其中关于响应时间timeout的处理,帮了我的大 ...
Ext点滴 -
inritxihc:
哦哦,解决了我的疑惑。
div层遮盖flash(兼容浏览器)
转自:http://www.duduwolf.com/wiki/2007/310.html
javacript中对xml dom的支持,与其他任何特性一样面临着浏览器兼容问题。
一 IE中的XML DOM
1.微软通过ActiveX的MSXML库提供了支持,通过:
得到一个XML DOM对象,这是在IE6中的,如果你的IE是更老版本的,可以使用下面的函数得到,如果你没有安装MSXML,将不能得到:
var arrSignatures = [ " MSXML2.DOMDocument.5.0 " , " MSXML2.DOMDocument.4.0 " ,
" MSXML2.DOMDocument.3.0 " , " MSXML2.DOMDocument " ,
" Microsoft.XmlDom " ];
for ( var i = 0 ; i < arrSignatures.length; i ++ ) {
try {
var oXmlDom = new ActiveXObject(arrSignatures[i]);
return oXmlDom;
} catch (oError) {
// ignore
}
}
throw new Error( " 你的系统没有安装MSXML " );
}
当然,如果你使用prototype库,可以使用Try.these函数。
2.XML DOM对象可以通过load和loadXML方法载入xml文件或者字符串:
oXmlDom.loadXML( " <root></root> " );
然后这个oXmlDom就可以使用所有的DOM对象方法,比如documentElement.tagName,参见:
《javascript之DOM技术(一)》
《javascript之dom技术(二)》
3.XML DOM默认是通过异步载入xml文件的,可以通过设置async值来选择是同步还是异步:
4. IE的XML DOM拥有一个readyState值用来表示载入文件的状态:
0——准备载入
1——正在载入
2——载入完成
3——载入完成并可用,但有一部分数据也许不可用
4——完全载入,完全可用。
相应的有一个onreadystatechange事件,当状态改变时发生,我们可以通过监听此事件来判断XML DOM对象的可用性
if (oXmlDom.readyState == 4 ) {
alert( " load test.xml done! " );
alert( " Tag name of the root element is " + oXmlDom.documentElement.tagName);
alert( " The root element has this many children: " + oXmlDom.documentElement.childNodes.length);
}
};
5.IE的XML DOM对象有一个xml属性,用来返回xml文件的字符串形式,比如
oXmlDom.load( " test.xml " );
alert(oXmlDom.xml);
alert出:<root><child/><child/></root>
6.IE,当载入的XML文件或者字符串解析错误时,将产生一个parseError对象,我们在下面的代码中演示此对象的属性:
oXmlDom.load( " errors.xml " );
// 0表示没有错误
if (oXmlDom.parseError != 0 ) {
var oError = oXmlDom.parseError;
alert( " An error occurred:\n错误代码: "
+ oError.errorCode + " \n "
+ " 行数: " + oError.line + " \n "
+ " 列数: " + oError.linepos + " \n "
+ " 原因: " + oError.reason);
}
二.Mozilla的XML DOM对象
1.XML DOM对象的创建,符合DOM标准的,通过document.implementation.createDocument()方法。比如:
这三个参数分别是文档命名空间、文档元素的标签名以及一个文档类型对象(总为null),比如:
这段代码创建了一个<a0:root xmlns="http://www.rubyeye.net"/>的XML DOM对象
2.载入xml,Mozilla与IE不同的是只提供了一个load()方法用于载入xml文件,没有提供loadXML()方法用于载入XML字符串。同步载入XML文件的代码与IE相同:
oXmlDom.load( " test.xml " );
异步载入稍有不同,因为Mozilla并不支持readyState属性,并且没有onreadystatechange事件,它只有一个onload的事件,当载入完成时触发;或者说相当于IE的readyState属性等于4的状态。
alert( " done " );
}
oXmlDom.load( " test.xml " );
要将XML字符串解析为DOM对象,必须使用DOMParser对象:
var oXmlDom=oParser.parseFromString( " <root><child/></root>, " text / xml " );
两个参数:要解析的XML字符串以及字符串的内容类型(只能为text/xml或者application/xml)。
不过我们可以实现自己的loadXML方法:
var oParser = new DOMParser();
var oXmlDom = oParser.parseFromString(sXml, " text/xml " );
// 删除原文档内容
while ( this .firstChild) {
this .removeChild( this .firstChild);
}
// 导入新的文档内容
for ( var i = 0 ; i < oXmlDom.childNodes.length; i ++ ) {
var oNewNode = this .importNode(oXmlDom.childNodes[i], true );
this .appendChild(oNewNode);
}
};
3.Mozilla没有提供IE的xml属性来返回XML文档内容,只能通过使用XMLSerializer对象:
var sXml = oSerializer.serializeToString(oXmlDom, " text/xml " );
同样两个参数:XML DOM对象以及转化成的文档类型。
同样,我们也可以给Mozilla的XML DOM对象定义一个属性xml,通过defineGetter方法:
var oSerializer = new XMLSerializer();
var sXml = oSerializer.serializeToString( this , " text/xml " );
});
以后就可以以IE的方式,oXmlDom.xml来获取XML文档内容。
4。错误处理,同样与IE不同,Mozilla当解析错误时会返回一段代码,以标签<prasereoor>包括其中的代码解释了错误发生的原因以及位置等信息,我们只有通过正则表达式解析此段代码,提取错误信息。
// 返回代码的标签名为parsererror,表示错误发生
if (oXmlDom.documentElement.tagName == " parsererror " ) {
reError.test(oXmlDom.xml);
alert( " An error occurred:\n描述: "
+ RegExp.$ 1 + " \n "
+ " 文件名: " + RegExp.$ 2 + " \n "
+ " 行数: " + RegExp.$ 3 + " \n "
+ " 列数: " + RegExp.$ 4 + " \n "
+ " 原因: " + RegExp.$ 5 );
}
三,提供一个跨浏览器的XML DOM对象解决方案,来自于《javascript高级程序设计》
function XmlDom() {
// 通过对象/属性检测法,判断是IE来是Mozilla
if (window.ActiveXObject) {
var arrSignatures = [ " MSXML2.DOMDocument.5.0 " , " MSXML2.DOMDocument.4.0 " ,
" MSXML2.DOMDocument.3.0 " , " MSXML2.DOMDocument " ,
" Microsoft.XmlDom " ];
for ( var i = 0 ; i < arrSignatures.length; i ++ ) {
try {
var oXmlDom = new ActiveXObject(arrSignatures[i]);
return oXmlDom;
} catch (oError) {
// ignore
}
}
throw new Error( " MSXML is not installed on your system. " );
// 同上
} else if (document.implementation && document.implementation.createDocument) {
var oXmlDom = document.implementation.createDocument( "" , "" , null );
// 创建Mozilla版本的parseError对象
oXmlDom.parseError = {
valueOf: function () { return this .errorCode; },
toString: function () { return this .errorCode.toString() }
};
// 初始化parseError对象
oXmlDom.__initError__();
oXmlDom.addEventListener( " load " , function () {
this .__checkForErrors__();
this .__changeReadyState__( 4 );
}, false );
return oXmlDom;
} else {
throw new Error( " Your browser doesn't support an XML DOM object. " );
}
}
// 此处用到了该书中一个浏览器系统检测js文件,如果是Mozilla
if (isMoz) {
Document.prototype.readyState = 0 ;
Document.prototype.onreadystatechange = null ;
Document.prototype.__changeReadyState__ = function (iReadyState) {
this .readyState = iReadyState;
if ( typeof this .onreadystatechange == " function " ) {
this .onreadystatechange();
}
};
// 初始化parseError对象
Document.prototype.__initError__ = function () {
this .parseError.errorCode = 0 ;
this .parseError.filepos = - 1 ;
this .parseError.line = - 1 ;
this .parseError.linepos = - 1 ;
this .parseError.reason = null ;
this .parseError.srcText = null ;
this .parseError.url = null ;
};
Document.prototype.__checkForErrors__ = function () {
if ( this .documentElement.tagName == " parsererror " ) {
var reError = /> ([\s\S] *? )Location:([\s\S] *? )Line Number (\d + ), Column (\d + ): < sourcetext > ([\s\S] *? )( ? :\ -* \ ^ ) / ;
reError.test( this .xml);
this .parseError.errorCode = - 999999 ;
this .parseError.reason = RegExp.$ 1 ;
this .parseError.url = RegExp.$ 2 ;
this .parseError.line = parseInt(RegExp.$ 3 );
this .parseError.linepos = parseInt(RegExp.$ 4 );
this .parseError.srcText = RegExp.$ 5 ;
}
};
// 定义Mozilla的loadXML方法
Document.prototype.loadXML = function (sXml) {
this .__initError__();
this .__changeReadyState__( 1 );
var oParser = new DOMParser();
var oXmlDom = oParser.parseFromString(sXml, " text/xml " );
while ( this .firstChild) {
this .removeChild( this .firstChild);
}
for ( var i = 0 ; i < oXmlDom.childNodes.length; i ++ ) {
var oNewNode = this .importNode(oXmlDom.childNodes[i], true );
this .appendChild(oNewNode);
}
// 载入后检查错误
this .__checkForErrors__();
// 没有问题,设置readyState属性为4
this .__changeReadyState__( 4 );
};
Document.prototype.__load__ = Document.prototype.load;
Document.prototype.load = function (sURL) {
this .__initError__();
this .__changeReadyState__( 1 );
this .__load__(sURL);
};
Node.prototype.__defineGetter__( " xml " , function () {
var oSerializer = new XMLSerializer();
return oSerializer.serializeToString( this , " text/xml " );
});
}
发表评论
-
虚拟机Ubuntu上WAS的安装笔记
2009-11-16 15:46 1842最近大家都在玩虚拟机,也决定装一个玩玩,要不然还真 ... -
如何进行Ajax框架选型?
2009-07-30 09:16 1228Ajax/RIA框架异彩纷呈,该如何做出取舍呢,《 Ajax ... -
设计中最常用的五类CSS选择器
2009-03-09 09:59 1139一、标签选择器: 顾名思议,标签选择器是直接将HT ... -
Ext点滴
2009-02-19 17:27 3742Ext.fly()正解 写道 Result: ... -
Ext事件机制
2009-02-19 14:41 1331先看看这里的说明:http://www.cnblogs.com ... -
Ext中实现表单列的横排
2009-01-22 16:50 2466首先看一个界面: 默认情况下,Ext中的FormPan ... -
全面理解javascript的caller,callee,call,apply概念
2009-01-08 14:15 1133转自:http://javascript.chinahtml ... -
JSDT-Eclipse下的Javascript调试插件
2008-11-11 08:24 4691简介: JSDT(Javascript De ... -
JS事件处理的一点细节
2008-10-16 09:20 1066在Javascript中我们可以利用下面的方式来给一个HTM ... -
Web开发小技巧
2008-08-17 13:41 946只显示垂直滚动条,不显示水平滚动条:设置body的style ... -
Cookie操作
2008-08-17 13:30 11451、在Javascript中操作Cookie: < sc ... -
JSON使用
2008-08-08 14:09 3539是什么? JSON(JavaScript O ... -
同源策略
2008-08-08 12:00 3622概念: 同源策 ... -
HTTP原始方法上传下载文件
2008-08-08 11:58 1363上传: 1、设置表单的ENCTYPE='multipart/f ... -
div VS. span
2008-08-08 11:54 1072在CSS的布局概念中,SPAN是一个内联元素(in ... -
利用JS屏蔽右键和检测键盘按键
2008-08-05 21:33 3242屏蔽鼠标右键: <body oncontextmenu= ...
相关推荐
Javascript操作XML Dom学习资料
在JavaScript中,可以使用`ActiveXObject`来创建XMLDOM对象,例如: ```javascript var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); ``` 这将创建一个空的XMLDOM实例,可以用于加载XML文档。 2. **加载...
这个"XMLDOM对象方法中文手册chm"提供了关于XML DOM在中文环境下的详细指南,对于理解和应用XML DOM技术至关重要。 1. **XML DOM基本概念** - DOM是一种与平台和语言无关的接口,它将XML文档解析为一个树形结构,...
JavaScript操作XML DOM对象是Web开发中的重要技能,尤其在处理数据交换、页面动态更新和跨平台通信时。本文将深入探讨这一主题,并结合JavaScript技巧,为开发者提供一个全面的指导。 1. **DOM(文档对象模型)基础...
XMLDOM(XML Document Object Model)是Microsoft开发的一种用于处理XML文档的接口,它允许程序员通过JavaScript或其他脚本语言在浏览器或服务器环境中动态地访问、创建和修改XML文档。这个对象模型提供了一种标准的...
XMLDOM(XML Document Object Model)是微软开发的一种用于处理XML文档的接口,它允许程序员通过JavaScript或其他编程语言在运行时动态地访问和修改XML数据。这个"XMLDOM对象方法手册"压缩包包含了一个名为"XMLDOM...
7. XMLDOM在微信小程序中的应用:在微信小程序中,通常会先通过`wx.request`获取XML数据,然后使用`DOMParser`解析XML字符串为DOM对象,接着就可以利用XMLDOM的方法处理数据,例如提取特定信息或更新小程序的显示...
在这个"xmldom对象模型手册"中,我们将会深入探讨XMLDOM的核心概念、使用方法以及在实际开发中的应用。 首先,XMLDOM提供了对XML文档的树状结构表示,每个XML元素都被映射为一个DOM节点。这些节点包括元素节点、...
XMLDOM是微软提供的一个接口,它允许程序员通过JavaScript、VBScript或其他支持COM的编程语言来处理XML文档。这个接口为XML文档提供了结构化的表示,使得开发者可以轻松地读取、修改、创建和保存XML数据。XMLDOM是...
### XML DOM对象方法详解 #### 一、XML DOM概述 XML DOM (Document Object Model) 是一种处理可扩展标记语言(XML)的标准方式。DOM定义了一种结构化的表示方式,用于访问和操作XML文档中的数据。通过DOM,开发人员...
本教程“XML教程之DOM对象参考手册”主要关注的是如何利用DOM API来解析和操作XML文档。DOM模型中,XML文档的每个元素、属性、文本节点等都被表示为一个对象,这些对象构成了一个层级关系,即所谓的DOM树。以下是DOM...
【学习 XML DOM】.pdf 是一份关于 XML DOM(文档对象模型)的学习资料,XML DOM 是一种 W3C 标准,它定义了如何访问和操作XML文档的规范。DOM 将XML文档解析成一个树形结构,每个组成部分都称为一个节点。理解XML ...
XML(eXtensible Markup Language)是一...总结,DOM对象是理解和操作XML文档的核心工具,通过本教程的学习,你可以深入了解DOM的工作原理,熟练掌握DOM对象的创建、访问、修改等操作,从而更好地利用XML解决实际问题。