jQuery插件xmlDOM源码学习
无废话,直接上代码:
/*
* jQuery xmlDOM Plugin v1.0
* http://outwestmedia.com/jquery-plugins/xmldom/
*
* Released: 2009-04-06
* Version: 1.0
*
* Copyright (c) 2009 Jonathan Sharp, Out West Media LLC.
* Dual licensed under the MIT and GPL licenses.
* http://docs.jquery.com/License
*/
(function($) {
if ( window['DOMParser'] == undefined && window.ActiveXObject ) {
DOMParser = function() { };
DOMParser.prototype.parseFromString = function( xmlString ) {
//IE使用ActiveXObject对象,而标准浏览器则使用DOMParser来解析
var parser = new ActiveXObject('Microsoft.XMLDOM');
//async设置为false关闭异步加载,这样确保在文档加载完成之前,脚本不会继续执行
parser.async = 'false';
/**
*loadXML方法用于加载字符串
*parser对象还有一个load方法用于加载xml文件,
*出于浏览器的同源策略限制,load方法只能加载本域的XML文件
*/
parser.loadXML( xmlString );
return parser;
};
}
$.xmlDOM = function(xml, onErrorFn) {
try {
//标准浏览器使用DOMParser来处理
var xmlDoc = ( new DOMParser() ).parseFromString( xml, 'text/xml' );
if ( $.isXMLDoc( xmlDoc ) ) {
var err = $('parsererror', xmlDoc);
if ( err.length == 1 ) {
throw('Error: ' + $(xmlDoc).text() );
}
} else {
throw('Unable to parse XML');
}
} catch( e ) {
var msg = ( e.name == undefined ? e : e.name + ': ' + e.message );
if ( $.isFunction( onErrorFn ) ) {
onErrorFn( msg );
} else {
$(document).trigger('xmlParseError', [ msg ]);
}
return $([]);
}
return $( xmlDoc );
};
})(jQuery);
上述插件只能解析字符串,而对于XML文件IE和标准浏览器的处理方式又完全不一样。下面的方法用于处理XML文件:
{
var parser;
if(window.ActiveXObject){
parser=new ActiveXObject("Microsoft.XMLDOM");
}else{
/**
*标准浏览器使用DomImplementation 来处理XML文件
*DomImplementation 接口是一个占位符,存放不专属任何特定 Document 对象,而对 DOM *实现来说是“全局性”的方法。可以通过任何 Document 对象的 implementation 属性获得对 *DomImplementation 对象的引用。
*参考地址:http://www.w3school.com.cn/xmldom/dom_http.asp
**/
parser=document.implementation.createDocument("","",null);
}
parser.async=false;
parser.load(xmlFile);
return parser;
}
至此我们知道了如何将字符串、XML文件转化为DOM,但是如果要将XML Node还原为XML字符串又将如何做呢?
对于标准浏览器,我们使用XMLSerializer,而IE则拥有自己独特的实现。
{
if(window.XMLSerializer) {
return (new XMLSerializer()).serializeToString(xmlNode);
}else if(typeof xmlNode.xml!='undefined'){
return xmlNode.xml;
}
return '';
}
注意:
此函数在IE浏览器中只能处理XML Node而不能处理HTML Node,在标准浏览器中可以成功地将HTML Node 转换为XML字符串。
转换的结果严格地遵循XML定义和约束,比如闭合标签、文本节点大小写等。
但是经过我测试,比如下面的HTML DOM:
<DIV id=con text='123'><span>xxx</span><MY>MY</MY></DIV>
<div id="con" text="123"><span>xxx</span><my>MY</my></div>
如果将"id=con"修改为“CON”或者“COn”之后就会返回空字符串。
至于为什么,我也不清楚。