跨浏览器之创建和处理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+"\n:"+xmlDOM.line+"\n:"+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文档序列化。

posted @ 2017-09-04 16:12  JavaScriptBUG  阅读(455)  评论(0编辑  收藏  举报