初识XML

来源:互联网 发布:淘宝官方 编辑:程序博客网 时间:2024/05/16 17:16

初识XML
一.XML是啥
XML只可扩展标记语言。
XML被设计用来传输和存储数据。
类似HTML语言,XML在形式上与HTML别无二致,不过,在用途上HTML是页面渲染语言,浏览器通过解析HTML将页面呈现给用户,而XML是用来存储与传输数据的,例如XML文件本来就是一种数据文件,同时我们可以通过XMLHTTPRequest对象实现后台与服务器之间的交互。另外,HTML的标记是预先定义的,而XML的标记是用户自己定义的,当然XML也必须符合特定的语法规范。

二.XMLHttpRequest对象
XMLHttpRequest对象用于在后台与服务器交换数据。
它能够实现:
1.在不重新加载页面的情况下更新网页;
2.在页面已加载后从服务器请求数据;
3.在页面已加载后从服务器接收数据;
4.在后台向服务器发送数据;
注:所有主流的浏览器都实现了对XMLHttpRequest对象的支持。

创建XMLHttpRequest对象:xmlHttp=new XMLHttpRequest();
当然,旧版本的ie5、6使用ActiveX对象:xmlHttp=new ActiveXObject(‘Microsoft.XMLHTTP’);

实例:

<html><head><script type="text/javascript">var xmlhttp;function loadXMLDoc(url){xmlhttp=null;if (window.XMLHttpRequest)  {// code for IE7, Firefox, Opera, etc.  xmlhttp=new XMLHttpRequest();  }else if (window.ActiveXObject)  {// code for IE6, IE5  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");  }if (xmlhttp!=null)  {  xmlhttp.onreadystatechange=state_Change;  xmlhttp.open("GET",url,true);  xmlhttp.send(null);  }else  {  alert("Your browser does not support XMLHTTP.");  }}function state_Change(){if (xmlhttp.readyState==4)  {// 4 = "loaded"  if (xmlhttp.status==200)    {// 200 = "OK"    document.getElementById('A1').innerHTML=xmlhttp.status;    document.getElementById('A2').innerHTML=xmlhttp.statusText;    document.getElementById('A3').innerHTML=xmlhttp.responseText;    }  else    {    alert("Problem retrieving XML data:" + xmlhttp.statusText);    }  }}</script></head><body><h2>Using the HttpRequest Object</h2><p><b>Status:</b><span id="A1"></span></p><p><b>Status text:</b><span id="A2"></span></p><p><b>Response:</b><br /><span id="A3"></span></p><button onclick="loadXMLDoc('note.xml')">Get XML</button></body></html>

另外这里要提下,关于ie6及以下创建XMLHttpRequest对象,一般有三种版本——MSXML2.XMLHttp、MSXML2.XMLHttp.3.0、MSXML2.XMLHttp.6.0。单独写一个ie对这三种版本的兼容:

function createXHR() {    if (typeof XMLHttpRequest != 'undefined') {        return new XMLHttpRequest();    } else if  (typeof ActiveXObject != 'undefined') {        var versions = [                                        'MSXML2.XMLHttp.6.0',                                        'MSXML2.XMLHttp.3.0',                                        'MSXML2.XMLHttp'        ];        for (var i = 0; i < versions.length; i ++) {            try {                return new ActiveXObject(version[i]);            } catch (e) {                //跳过            }         }    } else {        throw new Error('您的浏览器不支持XHR对象!');    }}var xhr = new createXHR();

三.XML解析器
所有主流的浏览器都内建了供读取和操作XML的XML解析器。
解析器把XML转换成XML DOM对象-可通过javascript操作的对象。
通俗地讲,解析器把XML载入内存,然后把它转换为可通过javascript访问的XML DOM对象。
ie浏览器:(通过Active对象实现)

ActiveXObject类型
XML版本字符串 说明
Microsoft.XmlDom 最初随同IE发布,不建议使用
MSXML2.DOMDocument 脚本处理而更新的版本,仅在特殊情况作为备份用
MSXML2.DOMDocument.3.0 在JavaScript中使用,这是最低的建议版本
MSXML2.DOMDocument.4.0 脚本处理时并不可靠,使用这个版本导致安全警告
MSXML2.DOMDocument.5.0 脚本处理时并不可靠,使用这个版本导致安全警告
MSXML2.DOMDocument.6.0 脚本能够可靠处理的最新版本

PS:在这六个版本中微软只推荐三种:
1.MSXML2.DOMDocument.6.0 最可靠最新的版本
2.MSXML2.DOMDocument.3.0 兼容性较好的版本
3.MSXML2.DOMDocument 仅针对IE5.5之前的版本
不同的ie版本可能有不同的兼容性,我们通过上面的三种方式进行浏览器兼容:

function createXMLDOM(){    var version=[        'MSXML2.DOMDocument.6.0',        'MSXML2.DOMDocument.3.0',        'MSXML2.DOMDocument'    ];    for(var i=0;i<version.length;i++){        try{            var xmlDom=new ActiveXObject(version[i]);            return xmlDom;        }        catch(e){            //跳过        }     }    throw new Error('您的 系统或不支持MSXML');}

注:当然,上面的兼容操作不仅仅适用于ie678同样对ie9、10、11也是兼容的,只是当我们用alert(xmlDom)时ie9、10、11会报错,但alert(xmlDom.xml)不会报错。

火狐浏览器(firefox):

var xmlDoc=document.implementation.createDocument("","",null);xmlDoc.async="false";xmlDoc.load("note.xml");

1.首先创建一个空的XML文档对象;
2.然后设置加载方式为同步,即确保在文档完全加载之前解析器不会继续脚本的执行;
3.最后指定要加载的XML文档。
PS:createDocument()方法需要传递三个参数,命名空间,根标签名和文档声明,由于JavaScript管理命名空间比较困难,所以留空即可。文档声明一般根本用不到,直接null即可。命名空间和文档声明留空,表示创建XMLDOM对象不需要命名空间和文档声明。
PS:命名空间的用途是防止太多的重名而进行的分类,文档类型表明此文档符合哪种规范,而这里创建XMLDOM不需要使用这两个参数,所以留空即可。
PS:不管在同步或异步来获取load()方法只有Mozilla的Firefox才能支持,只不过新版的Opera也是支持的,其他浏览器则不支持。

非ie浏览器:
Internet Explorer 使用 loadXML() 方法来解析 XML 字符串,而其他浏览器使用 DOMParser 对象。
如下:

txt="<bookstore><book>";txt=txt+"<title>Everyday Italian</title>";txt=txt+"<author>Giada De Laurentiis</author>";txt=txt+"<year>2005</year>";txt=txt+"</book></bookstore>";if (window.DOMParser)  {  parser=new DOMParser();  xmlDoc=parser.parseFromString(txt,"text/xml");  }else // Internet Explorer  {  xmlDoc=new ActiveXObject("Microsoft.XMLDOM");  xmlDoc.async="false";  xmlDoc.loadXML(txt);  }

注:微软的 XML 解析器与其他浏览器中的解析器之间,存在一些差异。微软的解析器支持 XML 文件和 XML 字符串(文本)的加载,而其他浏览器使用单独的解析器。不过,所有的解析器都包含遍历 XML 树、访问插入及删除节点(元素)及其属性的函数。
我们发现,除了ie和火狐(firefox 通过document.implementation.createDocument创建XML DOM对象)可以加载XML文件(当然这里ie文件文本都能加载,而firefox只能加载文件),其他的浏览器均只能加载XML文本。

现在我们以加载XML文本进行浏览器兼容:

(function(){    window.sys={};    var ua=navigator.userAgent.toLowerCase();    var s;    (s=ua.match(/firefox\/([\d.]+)/))?sys.firefox=s[1]:    (s=ua.match(/rv:([\d.]+)/))?sys.ie=s[1]:    (s=ua.match(/msie\s([\d.]+)/))?sys.ie=s[1]:    (s=ua.match(/chrome\/(.*)opr\/([\d.]+)/))?sys.opera=s[2]:    (s=ua.match(/version\/([\d.]+).*safari/)) ? sys.safari = s[1]:    (s=ua.match(/chrome\/([\d.]+)/))?sys.chrome=s[1]:0;    if (/webkit/.test(ua)) sys.webkit = ua.match(/webkit\/([\d.]+)/)[1];})();//跨浏览器返回XML DOM对象function getXMLDOM(xmlStr){    var xmlDom=null;    var xmlTemp=null;    // alert(sys.ie);    // alert(ActiveXObject);    if(typeof window.DOMParser!='undefined' && !sys.ie){        xmlDom=(new DOMParser()).parseFromString(xmlStr,'text/xml');        var errors=xmlDom.getElementsByTagName('parsererror');        if(errors.length>0){            throw new Error('错误信息:'+errors[0].textContent);        }    }    else if(window.ActiveXObject!='undefined'){        var version=[            'MSXML2.DOMDocument6.0',            'MSXML2.DOMDocument3.0',            'MSXML2.DOMDocument'        ];        for(var i=0;i<version.length;i++){            try{                xmlDom=new ActiveXObject(version[i]);                xmlTemp=xmlDom;            }            catch(e){                    //跳过            }        }        xmlDom=xmlTemp;        xmlDom.loadXML(xmlStr);        if(xmlDom.parseError!=0){            throw new Error('错误信息:'+xmlDom.parseError.reason);        }        // return xmlDom;    }    else{        throw new Error('您的系统或浏览器不支持XML DOM对象');    }    return xmlDom;}//序列化XMLfunction serializerXML(xmlDom){    var xml='';    if(window.XMLSerializer!=undefined && !sys.ie){        xml=(new XMLSerializer()).serializeToString(xmlDom);    }else if(xmlDom.xml!=undefined){        xml=xmlDom.xml;    }    else{        throw new Error('无法解析XML');    }    return xml;}