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”之后就会返回空字符串。
至于为什么,我也不清楚。
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号