XML:Extensible Markup Language(可擴(kuò)展標(biāo)記語(yǔ)言)
是SGML(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言)的子集拿霉,是w3c的推薦標(biāo)準(zhǔn)。
用途:xml可以對(duì)文檔和數(shù)據(jù)進(jìn)行結(jié)構(gòu)化處理咱扣,他被設(shè)計(jì)用來(lái)存儲(chǔ)和傳輸結(jié)構(gòu)化數(shù)據(jù)绽淘。
XML一度成為存儲(chǔ)和通過(guò)因特網(wǎng)傳輸結(jié)構(gòu)化數(shù)據(jù)的標(biāo)準(zhǔn)。
特點(diǎn):
xml是一種很像html的標(biāo)記語(yǔ)言闹伪。
設(shè)計(jì)的宗旨是用來(lái)傳輸數(shù)據(jù)而不是顯示數(shù)據(jù)沪铭。
他的標(biāo)簽沒有被預(yù)定義,需要自定義標(biāo)簽偏瓤。
他被設(shè)計(jì)為具有自我描述性
是W3C的推薦標(biāo)準(zhǔn)杀怠。
IE8及之前版本的XML
IE是第一個(gè)支持xml的瀏覽器,IE9及以后的瀏覽器都已經(jīng)支持DOM2級(jí)規(guī)范厅克,對(duì)于IE8及之前版本對(duì)XML的支持是通過(guò)activeX對(duì)象實(shí)現(xiàn)的赔退。微軟創(chuàng)建了MSXML庫(kù),這是系統(tǒng)自帶的证舟,并沒有針對(duì)JS創(chuàng)建對(duì)象硕旗,所以對(duì)于IE8及之前版本的瀏覽器只有在微軟系統(tǒng)下,才能正常的使用xml女责。創(chuàng)建XML文檔實(shí)例
方法:需要使用ActiveXobject構(gòu)造函數(shù)漆枚,并為其傳入一個(gè)表示XML文檔版本的字符串。
function createXmlDocument(){
outermost:
if(typeof arguments.callee.activeXString!="string"){
var versions=["MSXML2.DOMDocument.6.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument"];
for(var i=0;i<versions.length;i++){
try {
new ActiveXObject(versions[i]);
arguments.callee.activeXString=versions[i];
break outermost;
}catch(e){
//跳過(guò)
}
}
throw new Error("您的系統(tǒng)或?yàn)g覽器不支持MSXML庫(kù)");
}
return new ActiveXObject(arguments.callee.activeXString);
}
var xmldom=createXmlDocument();
alert(xmldom);
特點(diǎn):
1抵知、arguments.callee.activeXString
這句代碼運(yùn)用了函數(shù)的內(nèi)部屬性對(duì)象arguments以及調(diào)用他的屬性callee返回函數(shù)createXmlDocument墙基,并為該函數(shù)設(shè)置了一個(gè)自定義的屬性昔榴,用來(lái)存放該瀏覽器所支持的MSXML庫(kù)版本信息。
2碘橘、使用if語(yǔ)句的原因互订,是想如果使用函數(shù)創(chuàng)建了一次xml對(duì)象,獲得版本信息后痘拆,下次就可以直接使用不用再次循環(huán)判斷仰禽。
3、錯(cuò)誤捕獲:當(dāng)new ActiveXObject(versions[i]);
發(fā)生錯(cuò)誤時(shí)纺蛆,或跳過(guò)該版本至下一個(gè)版本吐葵,如果成功,直接返回new ActiveXObject(arguments.callee.activeXString)
桥氏,如果均不成功温峭,那么拋出錯(cuò)誤信息。
4字支、使用label與break結(jié)合凤藏,因?yàn)閱为?dú)使用break只會(huì)跳到for外面,那么無(wú)論版本存不存在堕伪,都會(huì)拋出錯(cuò)誤揖庄。加上標(biāo)簽,使得直接跳轉(zhuǎn)至if語(yǔ)句外欠雌。-
載入xml
- 加載xml字符loadXML()
var xmldom=createXmlDocument();
xmldom.loadXML("<root><user>Lee</user></root>");//加載字符串
//alert(xmldom.xml);//序列化xml
var anotheruser=xmldom.createElement("user");
var usertxt=xmldom.createTextNode('duu');
anotheruser.appendChild(usertxt);
xmldom.documentElement.appendChild(anotheruser);
【發(fā)現(xiàn)】原先document.××××的地方都被新建的xml對(duì)象替換了蹄梢。這個(gè)對(duì)象的每一個(gè)dom節(jié)點(diǎn)都有一個(gè)xml屬性,用來(lái)表示該節(jié)點(diǎn)的xml字符串富俄。 - 加載XML外部文件load()
- 加載xml字符loadXML()
要加載的文檔必須是與頁(yè)面中運(yùn)行的js腳本文件來(lái)自于同一臺(tái)服務(wù)器禁炒。
在服務(wù)器端加載文檔的方式分為同步與異步。
簡(jiǎn)單理解:
同步:必須要等待文檔加載完畢才可以執(zhí)行后續(xù)代碼霍比。(缺點(diǎn):造成阻塞幕袱,假死等現(xiàn)象)
異步:文檔與后續(xù)代碼可以分別執(zhí)行。(缺點(diǎn):造成后續(xù)代碼執(zhí)行時(shí)桂塞,獲取不到文檔的內(nèi)容)
但是凹蜂,我們?cè)诩虞d文檔的時(shí)候通常都試用異步的方式馍驯,在異步加載文檔時(shí)阁危,需要為xmldom文檔的`onreadystatechange`事件制定處理程序。
var xmldom=createXmlDocument();
xmldom.async=true;
xmldom.onreadystatechange=function(){
if(xmldom.readyState==4){
alert(xmldom.xml);
}
}
xmldom.load("demo.xml");
特點(diǎn):
1汰瘫、async
xml對(duì)象的這個(gè)屬性狂打,可以設(shè)置加載文檔的方式是同步還是異步,默認(rèn)值為true混弥,表示異步趴乡,false表示同步对省。
2、事件處理程序要寫在.load
之前晾捏,這樣當(dāng)事件發(fā)生時(shí)蒿涎,可以觸發(fā)。
3惦辛、xmldom.readyState
該屬性一共有4個(gè)就緒狀態(tài)劳秋,為4時(shí),表示已經(jīng)完全可以使用加載的文檔胖齐。
4玻淑、事件處理程序內(nèi)不可以使用this,因?yàn)閠his指向的是window對(duì)象呀伙。
-
錯(cuò)誤解析
如果解析過(guò)程中出錯(cuò)补履,可以去xml文檔對(duì)象的parseError
屬性中找到錯(cuò)誤信息。
進(jìn)行測(cè)試將demo.xml的標(biāo)記做一個(gè)改動(dòng)剿另。
var xmldom=createXmlDocument();
xmldom.async=true;
xmldom.onreadystatechange=function(){
if(xmldom.readyState==4){
if(xmldom.parseError!=0){
alert("錯(cuò)誤信息:\n錯(cuò)誤行號(hào):"+xmldom.parseError.line+
"\n錯(cuò)誤代碼:"+xmldom.parseError.errorCode+
"\n所在文件:"+xmldom.parseError.url+
"\n錯(cuò)誤原因:"+xmldom.parseError.reason)
}
else{
alert(xmldom.xml);
}} } xmldom.load("demo.xml");
我在上面的載入文件的基礎(chǔ)上箫锤,添加了對(duì)錯(cuò)誤解釋的判斷。
特點(diǎn):xmldom.parseError
的默認(rèn)值為errorCode雨女。當(dāng)沒有發(fā)生錯(cuò)誤使麻汰,該值為0,一旦發(fā)生錯(cuò)誤戚篙,該值要么是正數(shù)要么是負(fù)數(shù)五鲫。