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文件:


function loadXMLDoc(xmlFile)  

{
    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则拥有自己独特的实现。

    function serializeToString(xmlNode)
    {
        
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> 

结果serializeToString后转换后的结果是:

<div id="con" text="123"><span>xxx</span><my>MY</my></div> 

 如果将"id=con"修改为“CON”或者“COn”之后就会返回空字符串。

至于为什么,我也不清楚。 

posted @ 2011-08-16 19:56  高凡凡高  阅读(439)  评论(0编辑  收藏  举报