JS—XML(IE8及以前)

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()

要加載的文檔必須是與頁(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汰瘫、asyncxml對(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ù)五鲫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市岔擂,隨后出現(xiàn)的幾起案子位喂,更是在濱河造成了極大的恐慌,老刑警劉巖乱灵,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件塑崖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡痛倚,警方通過(guò)查閱死者的電腦和手機(jī)规婆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蝉稳,“玉大人抒蚜,你說(shuō)我怎么就攤上這事≡牌荩” “怎么了嗡髓?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)收津。 經(jīng)常有香客問(wèn)我饿这,道長(zhǎng)浊伙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任长捧,我火速辦了婚禮巧勤,結(jié)果婚禮上度迂,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好漱牵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布寂呛。 她就那樣靜靜地躺著其馏,像睡著了一般骗奖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上声功,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天烦却,我揣著相機(jī)與錄音,去河邊找鬼先巴。 笑死其爵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的伸蚯。 我是一名探鬼主播摩渺,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼剂邮!你這毒婦竟也來(lái)了摇幻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤挥萌,失蹤者是張志新(化名)和其女友劉穎绰姻,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體引瀑,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狂芋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了憨栽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帜矾。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖屑柔,靈堂內(nèi)的尸體忽然破棺而出屡萤,到底是詐尸還是另有隱情,我是刑警寧澤锯蛀,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布灭衷,位于F島的核電站次慢,受9級(jí)特大地震影響旁涤,放射性物質(zhì)發(fā)生泄漏翔曲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一劈愚、第九天 我趴在偏房一處隱蔽的房頂上張望瞳遍。 院中可真熱鬧,春花似錦菌羽、人聲如沸掠械。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)猾蒂。三九已至,卻和暖如春是晨,著一層夾襖步出監(jiān)牢的瞬間肚菠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工罩缴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚊逢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓箫章,卻偏偏與公主長(zhǎng)得像烙荷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子檬寂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 個(gè)人博客:https://yeaseonzhang.github.io 花了半個(gè)多月的時(shí)間终抽,終于又把“JS紅寶書”...
    Yeaseon閱讀 1,751評(píng)論 2 23
  • HTML HTML5標(biāo)簽 媒體查詢head部分寫法 Doctype作用? 嚴(yán)格模式與混雜模式如何區(qū)分?它們有何意義...
    Mayo_閱讀 643評(píng)論 0 8
  • AjaxAsynchronous JavaScript XML這一技術(shù)最早是用來(lái)向服務(wù)器端請(qǐng)求以xml這種結(jié)構(gòu)表示...
    Miss____Du閱讀 1,048評(píng)論 1 4
  • 第一章: JS簡(jiǎn)介 從當(dāng)初簡(jiǎn)單的語(yǔ)言桶至,變成了現(xiàn)在能夠處理復(fù)雜計(jì)算和交互拿诸,擁有閉包、匿名函數(shù)塞茅, 甚至元編程等...
    LaBaby_閱讀 1,667評(píng)論 0 6
  • 有人說(shuō)過(guò)亩码,很多彎路到最后都成了直路,所有的坑到最后也都成了坦途野瘦;所謂的直路和坦途并不是擺在眼前的描沟,都是不斷的的...
    老衲法號(hào)一眉道人閱讀 1,329評(píng)論 0 4