您的位置:首页 > Web前端 > JavaScript

IE和Mozilla中都能运行的javascript的xml解析代码

2014-10-30 11:27 555 查看
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>New Document</TITLE>
<script type="text/javascript">
if(document.implementation && document.implementation.createDocument){
alert('运行了Mozilla');
/*因为Mozilla中不支持readyState和onreadystatechange特性
*所以要为Mozilla定义这些属性
*/
Document.prototype.readyState = 0;
Document.prototype.onreadystatechange = null;
/*因为Mozilla中不能监听事件状态
*所以要为Mozilla创建监听事件状态私有方法
*/
Document.prototype._changeReadyState_ = function(iReadyState){
this.readyState = iReadyState;
if(typeof this.onreadystatechange == "function"){
this.onreadystatechange();
}
};
//初始化错误变量
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对象赋上_checkForErrors_私有原型属性
*判断是否XML解析错误,如果解析错误,得到各个错误信息
*/
Document.prototype._checkForErrors_ = function(){
/*
*因为Mozilla中如果解析XML错误后不会报错,而是直接显示出错误(判断oXmlDom.documentElement.tagName == *'parsererror')即可
*/
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中五种状态的模拟,将字符串转化成xml
Document.prototype.loadXML = function(sXml){
this._initError_();
//即将开始载入
this._changeReadyState(1);
var oParser = new DOMParser();
//Mozilla中将字符串转化成xml对象
var oXmlDom = oParser.parseFromString(sXml,"text/xml");
//清空Docuemnt
while(this.firstChild){
this.removeChild(this.firstChild);
}
for(var i=0;i<oXmlDom.childNodes.length;i++){
//将字符串转化的xml对象的结点导入到文档对象中
var oNewNode = this.importNode(oXmlDom.childNodes[i],true);
this.appendChild(oNewNode);
}
//判断是否有错误
this._checkForErrors_();
//载入完成
this._changeReadyState(4);
};
//Mozilla中原始load,直接读取xml文件,将Mozilla中本身拥有的load方法的引用存起来
Document.prototype._load_ = Document.prototype.load;
//Mozilla中模拟load,定义新的Mozilla的load方法
Document.prototype.load = function(sURL){
//初始化错误
this._initError_();
this._changeReadyState_(1);
//调用本身已有的load方法
this._load_(sURL);
};
/*因为Mozilla没有Node.xml这个方法获得某个结点的xml字符串
*所以我们用Mozilla的_defineGetter_方法将xml特性和对应的方法绑定在一起
*
*/
Node.prototype.__defineGetter__('xml',function(){
var oSerializer = new XMLSerializer();
//将这个xml对象转换成字符串
return oSerializer.serializeToString(this,"text/xml");
});

}
//此方法是从IE和Mozilla浏览器中得到xmldom对象,并返回xml对象oXmlDom
function XmlDom(){
if(window.ActiveXObject){
alert('创建了IE的xml对象');
//IE中xml对象的各个版本
var arrSignatures	=['MSXML2.DOMDocument.5.0','MSXML2.DOMDocument.4.0','MSXML2.DOMDocument.3.0','MSXMS2.DOMDocument','Microsoft.XmlDom'];
for(var i=0;i < arrSignatures.length;i++){
try{
//IE中创建基于ActiveX的ActiveXObject对象
var oXmlDom = new ActiveXObject(arrSignatures[i]);
return oXmlDom
}catch(oError){
//抛出异常
throw new Error("无法创建IE的"+arrSignatures[i]+"版本的ActiveXObject对象");
}
}
}else if(document.implementation && document.implementation.createDocument){
alert('创建了Mozilla的xml对象');
//创建Mozilla的XML DOM对象
var oXmlDom = document.implementation.createDocument('','',null);
/*IE中XML的错误特性是parseError,对parseError自身取值,返回的是errorCode代码,不等于0则表示没有错误
*因为Mozilla中如果解析XML错误后不会报错,而是直接显示出错误(判断oXmlDom.documentElement.tagName == *'parsererror')
*所以要给Mozilla的XML对象创建parseError属性,并重写valueOf和toString方法
*/
oXmlDom.parseError = {
//直接返回错误代码
valueOf:function(){
return this.errorCode;
},
//返回错误信息
toString:function(){
return this.errorCod.toString()
}
};
/*当IE和Mozilla的XML对象都有parseError属性后
*初始化parseError的各个属性的初始值
*/
oXmlDom._initError_();
/*因为Mozilla的load没有改变事件状态,所以我们自己加上事件状态部分
*在Mozilla的对象创建完后,调用load方法时,如果成功将状态改为4,即完全加载完成状态
*/
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");
}
}

var oXmlDom = new XmlDom();
oXmlDom.onreadystatechange = function(){
alert('事件状态监听:'+oXmlDom.readyState);
if(oXmlDom.readyState == 4){
if(oXmlDom.parseError !=0){
alert('错误信息\n'+oXmlDom.parseError);
var oError = oXmlDom.parseError;
alert('An error occurred:\nError Cod:'+oError.errorCode+'\nLine:'+oError.line+'\nLine Pos:'+oError.linepos+'\nReason:'+oError.reason);
}else{
alert('加载成功');
}
}
}
oXmlDom.async = false;
oXmlDom.load('test.xml');
alert('将oXmlDom对象转换成字符串:\n'+oXmlDom.xml);
</script>
</HEAD>

<BODY>

<input type="text" value="123"></input>
</BODY>
</HTML>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: