• 跨浏览器之创建和处理XML


    XML在不同浏览器下的创建方式,解析成DOM方式和序列化方式都有很大的差异。

    主要区分的是

    1.IE9.0之前版本中的XML

    2.DOM2级核心下的XML

    为了解决这种差异,编写了一个函数用以在任何浏览器下都能解析和序列化。

    首先建立一个函数,用以在IE9之前创建xml空文档:

     1 //IE9.0之前的版本创建xml文档
     2 function createXMLFromIe(){
     3     if(typeof arguments.callee.activeXString!="string"){
     4         var version = ["MSXML2.DOMDocument.6.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument"],
     5             i;
     6         for(i in version){//遍历每一个库,寻找能支持的最高级的库,并且创建对象
     7             try{
     8                 new ActiveXObject(version[i]);
     9                 arguments.callee.activeXString = version[i];
    10                 break;
    11             }catch(e){
    12                 //跳过
    13             }
    14         }
    15         return new ActiveXObject(arguments.callee.activeXString);
    16     }
    17 }

    这个函数用了平稳退化来创建,尽可能保证在IE9.0之前所创建的XML文档是最新的版本。

    当然,在IE9.0之后能,或者firefox chrome 等浏览器下要创建XML文档,只需要使用:

    document.implementation.createDocument("","root",null);

    第一个参数是命名空间,第二个是相应的XML文档元素,第三个是文档类型。

    然后就是将XML文档解析成DOM文档:

     1 //解析XML文档为DOM文档
     2 function parseXML(xml){
     3     var xmlDOM = null;
     4     if(typeof DOMParser!="undefined"){//兼容ie9+ safari Chrome opera
     5         var parser = new DOMParser();
     6         xmlDOM = parser.parseFromString(xml,"text/xml");
     7         var error = xmlDOM.getElementsByTagName("parsererror");
     8         if(error.length){
     9             throw new Error("解析出错!"+error.textContent);
    10         }
    11     }else if(typeof ActiveXObject!="undefined"){//兼容ie9.0以下
    12         xmlDOM = createXMLFromIe();
    13         xmlDOM.loadXML(xml);
    14         if(xmlDOM.parseError.errorCode!=0){
    15             throw new Error("解析出现错误:"+xmlDOM.reason+"
    :"+xmlDOM.line+"
    :"+xmlDOM.linepos);
    16         }
    17     }
    18     else{
    19         throw new Error("no XML parser available!");
    20     }
    21     return xmlDOM;
    22 }

    要解析一个文档,在IE9.0之前的版本主要用的是。loadXML()方法,参数是一个xml字符串,然后解析出来。而在IE9+中,主要用到的是DOMParser类型,在解析XML文档之前,首先必须创建一

    个DOMParser对象,然后再调用这个对象下的parseFromStrng()方法,这个方法接受两个参数,第一个是要解析的XML字符串,第二个是内容类型,一般都用text/xml。

    最后就剩下序列化xmlDOM文档了:

     1 //序列化xmldom文档
     2 function serializeXML(xmldom){
     3     if(typeof XMLSerializer!="undefined"){//兼容ie9+ safari Chrome opera
     4         var serializer = new XMLSerializer();
     5         return (serializer.serializeToString(xmldom));
     6     }
     7     else if((typeof xmldom.xml)!=undefined){//兼容ie9.0以下
     8         return (xmldom.xml);
     9     }
    10     else{
    11         throw new Error("serialize XML Dom failed!");
    12     }
    13 }

    同样的区分为IE9之前和IE9之后的版本,在IE9之前呢,要序列化,只需要在xmlDOM文档后面添加一个.xml就完成了;而IE9+下,要序列化就要用到XMLserializer类型,首先,必须创建XMLserializer的实例,然后再调用该实例下的serializeTostring()方法,该方法只有一个参数,就是你要序列化的xmlDOM文档。

    创建XML→将XML文档解析为DOM文档→将XML DOM文档序列化。

  • 相关阅读:
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    C#使用BouncyCastle操作国密SM3
    Win10 2004种子
    Excel对比两列数据,找到重复项
    CentOS7 + frp远程访问内网Windows电脑
    Docker on Mac OS
    MySQL5.6中查询多边形包含点情况(ST_Contains、ST_Within)
    SQL查询表的所有字段名
    清除文本中Html的标签
  • 原文地址:https://www.cnblogs.com/178-533/p/7474102.html
Copyright © 2020-2023  润新知