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文档序列化。