• 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”之后就会返回空字符串。

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

  • 相关阅读:
    时间编程
    移动文件流的读写指针---fseek
    Xadmin添加用户小组件出错render() got an unexpected keyword argument 'renderer
    xadmin安装
    Django:Python3.6.2+Django2.0配置MySQL 转载
    gitignore文件不生效
    django图片上传修改图片名称
    python3 提示sqlite模块不存在
    Django-admin列表展示上传图片
    django使用admin站点上传图片
  • 原文地址:https://www.cnblogs.com/1000/p/xmldom.html
Copyright © 2020-2023  润新知