JSON与XML的区别对比及案例应用(2)

SAX不需要整个读入文档就可以对解析出的内容进行处理,是一种逐步解析的方法。程序也可以随时终止解析。这样,一个大的文档就可以逐步的、一点一点的展现出来,所以SAX适合于大规模的解析。这一点,JSON目前是做不到得。

所以,JSON和XML的轻/重量级的区别在于:

JSON只提供整体解析方案,而这种方法只在解析较少的数据时才能起到良好的效果;

XML提供了对大规模数据的逐步解析方案,这种方案很适合于对大量数据的处理。

(2).关于数据格式编码及解析难度

<1>.在编码方面。

虽然XML和JSON都有各自的编码工具,但是JSON的编码要比XML简单,即使不借助工具,也可以写出JSON代码,但要写出好的XML代码就有点困难;与XML一样,JSON也是基于文本的,且它们都使用Unicode编码,且其与数据交换格式XML一样具有可读性。

主观上来看,JSON更为清晰且冗余更少些。JSON网站提供了对JSON语法的严格描述,只是描述较简短。从总体来看,XML比较适合于标记文档,而JSON却更适于进行数据交换处理。

<2>.在解析方面。

在普通的web应用领域,开发者经常为XML的解析伤脑筋,无论是服务器端生成或处理XML,还是客户端用 JavaScript 解析XML,都常常导致复杂的代码,极低的开发效率。
实际上,对于大多数Web应用来说,他们根本不需要复杂的XML来传输数据,XML宣称的扩展性在此就很少具有优势,许多Ajax应用甚至直接返回HTML片段来构建动态Web页面。和返回XML并解析它相比,返回HTML片段大大降低了系统的复杂性,但同时缺少了一定的灵活性。同XML或 HTML片段相比,数据交换格式JSON 提供了更好的简单性和灵活性。在Web Serivice应用中,至少就目前来说XML仍有不可动摇的地位。

(3).实例比较

XML和JSON都使用结构化方法来标记数据,下面来做一个简单的比较。

<1>.用XML表示中国部分省市数据如下:

<?xml version="1.0" encoding="utf-8" ?> <country> <name>中国</name> <province> <name>黑龙江</name> <citys> <city>哈尔滨</city> <city>大庆</city> </citys>    </province> <province> <name>广东</name> <citys> <city>广州</city> <city>深圳</city> <city>珠海</city> </citys>    </province> <province> <name>台湾</name> <citys>  <city>台北</city>  <city>高雄</city> </citys>  </province> <province> <name>新疆</name> <citys> <city>乌鲁木齐</city> </citys> </province> </country>

<2>.用JSON表示中国部分省市数据如下

var country = { name: "中国", provinces: [ { name: "黑龙江", citys: { city: ["哈尔滨", "大庆"]} }, { name: "广东", citys: { city: ["广州", "深圳", "珠海"]} }, { name: "台湾", citys: { city: ["台北", "高雄"]} }, { name: "新疆", citys: { city: ["乌鲁木齐"]} } ] }

编码的可读性来说,XML有明显的优势,毕竟人类的语言更贴近这样的说明结构。JSON读起来更像一个数据块,读起来就比较费解了。不过,我们读起来费解的语言,恰恰是适合机器阅读,所以通过JSON的索引country.provinces[0].name就能够读取“黑龙江”这个值。

编码的手写难度来说,XML还是舒服一些,好读当然就好写。不过写出来的字符JSON就明显少很多。去掉空白制表以及换行的话,JSON就是密密麻麻的有用数据,而XML却包含很多重复的标记字符。

案例运用:省的三级联动

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script src="https://www.jb51.net/js/封装Ajax.js" type="text/javascript" charset="utf-8"></script> </head> <body> <select onchange="chooseP(this.value)"> <option>湖北省</option> </select> <select onchange="chooseC(this.value)"> <option>武汉市</option> </select> <select> <option>江城区</option> </select> </body> <script> objAJAX.getAjax("get", "xml/Provinces.xml", "", callBackOk, callBackFail, ""); function callBackOk(data) { var provences = data.getElementsByTagName("Province"); /*<Province ProvinceName="北京市">北京市</Province> */ for(var i = 0; i < provences.length; i++) { var Potion = document.createElement("option"); //<option><option/> Potion.value = provences[i].getAttribute("ID"); //把id传给value Potion.innerHTML = provences[i].innerHTML; document.getElementById("provence").appendChild(Potion); } } function callBackFail() { alert("服务器出错啦") } //市级联动 function chooseP(id) { objAJAX.getAjax("get", "xml/Cities.xml", "", callBackOkP, callBackFailP, ""); function callBackOkP(data) { document.getElementById("city").innerHTML = ""; //alert( typeof data) var citys = data.getElementsByTagName("City"); //alert(citys.length) /*<City CityName="北京市" PID="1" ZipCode="100000">北京市</City>*/ for(var i = 0; i < citys.length; i++){ var Coption = document.createElement("option"); //<option><option/> Coption.value = citys[i].getAttribute("ID"); var PID = citys[i].getAttribute("PID"); if(id == PID) { Coption.innerHTML = citys[i].innerHTML; var dd=Coption.value; document.getElementById("city").appendChild(Coption); } } alert(Cvalue); chooseC(Cvalue); } function callBackFailP() { alert("服务器出错啦") } } //县级联动 function chooseC(id) { objAJAX.getAjax("get", "xml/Districts.xml", "", callBackOkP, callBackFailP, ""); function callBackOkP(data) { document.getElementById("area").innerHTML = ""; //alert( typeof data) var districts = data.getElementsByTagName("District"); //alert(citys.length) /* <District DistrictName="东城区" CID="1">东城区</District>*/ for(var i = 0; i < districts.length; i++) { var Xoption = document.createElement("option"); //<option><option/> Xoption.value = districts[i].getAttribute("ID"); var CID = districts[i].getAttribute("CID"); if(id == CID) { Xoption.innerHTML = districts[i].innerHTML; document.getElementById("area").appendChild(Xoption); } } } function callBackFailP() { alert("服务器出错啦") } } </script> </html>

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzzxfx.html