如何用jQuery加載并解析XML(待更新)

[目錄](méi)

  • XML
    • 什么是XML?
    • XML語(yǔ)法
    • 正確的XML格式范例
  • 加載XML
    • Content-Type設(shè)置
    • 獲取XML
    • 解析XML
  • 禁用緩存
  • 加載不上?

XML

什么是XML?

XML(eXtensible Markup Language)即可擴(kuò)展標(biāo)記語(yǔ)言。

XML語(yǔ)法

在XML中采用如下的語(yǔ)法

  1. 任何起始標(biāo)簽都必須有一個(gè)結(jié)束標(biāo)簽;
//以下代碼錯(cuò)誤,XML必須是封閉的,它沒(méi)有閉合
<?xml version="1.0" encoding="UTF-8"?> 
<name>zhangsan
  1. 可以采用另一種簡(jiǎn)化語(yǔ)法,即在一個(gè)標(biāo)簽中同時(shí)表示起始和結(jié)束標(biāo)簽。這種語(yǔ)法是:<tag/>。(ps:很像html中的單標(biāo)簽是不?^ ^)在XML解析器中會(huì)將其翻譯成<tag></tag>。

  2. 標(biāo)簽必須按照合理的順序進(jìn)行嵌套,因此結(jié)束標(biāo)簽必須按鏡像順序匹配起始標(biāo)簽。

//以下代碼錯(cuò)誤,因?yàn)樵跊](méi)有關(guān)閉所有內(nèi)部括號(hào)之前,不能關(guān)閉外面的括號(hào)
<?xml version="1.0" encoding="UTF-8"?> 
<name>zhangsan<i>sample</name>haha</i>
  1. 所有的屬性都要有值,并且需要在值的周?chē)由想p引號(hào)。

  2. XML文檔只能有一個(gè)頂層元素。

//以下代碼錯(cuò)誤,因?yàn)樗卸鄠€(gè)頂層元素
<?xml version="1.0" encoding="UTF-8"?> 
<name>zhangsan</name>
<id>1</id>
<name>wangwu</name>
<id>2</id>
  1. XML可以使用自己發(fā)明的標(biāo)簽。
    因?yàn)閄ML中沒(méi)有預(yù)定義標(biāo)簽,所以XML允許創(chuàng)作者定義自己的標(biāo)簽和自己的文檔結(jié)構(gòu)。

正確的XML格式范例

<?xml version="1.0" encoding="UTF-8"?> 
<stulist>
      <student email="123456@qq.com">
              <name>xiaoming</name>
              <age>20</age>
      </student>
      <student email="234567@qq.com">
              <name>xiaogang</name>
               <age>21</age>
      </student>
</stulist>

加載XML

Content-Type設(shè)置

加載XML的時(shí)候,如果Content-Type本身就是一個(gè)XML文件則是不需要設(shè)置;如果是后臺(tái)程序動(dòng)態(tài)生成,那么就需要設(shè)置Content-Type為"text/xml",否則jQuery就會(huì)以默認(rèn)的"text/html"方式處理,導(dǎo)致解析失敗。
以下是幾種常見(jiàn)語(yǔ)言中設(shè)置Content-Type的方式。

  • header("Content-Type:text/xml"); //PHP
  • response.ContentType="text/xml"; //ASP
  • response.setContentType("text/xml"); //JSP

獲取XML

如果有了正確的XML結(jié)構(gòu)的文件,那么就可以通過(guò)jQuery的Ajax函數(shù)進(jìn)行讀取了,jQuery代碼如下:

$.ajax({
  url:'ajax.xml',
  type:'GET',
  dataType:'xml',
  timeout:1000,       //設(shè)定超時(shí)
  cache:false,         //禁用緩存
  error:function(xml){
          alert("加載XML文檔出錯(cuò)");
  },
  success:function(xml){
          //這里用于解析XML
  }
})

這樣就可以讀取XML,當(dāng)然也可以用簡(jiǎn)單的$.get()方法和$.post()方法

$.get('ajax.xml',function(xml){
        //這里用于解析XML
        console.log(xml);
});
console1.png

解析XML

解析XML文檔和解析DOM一樣,也可以用find()、children()等函數(shù)來(lái)解析和用each()方法來(lái)進(jìn)行遍歷,另外也可以用text()和attr()方法來(lái)獲取節(jié)點(diǎn)文本和屬性。例如在success回調(diào)里解析XML:

success:function(xml){
        $(xml).find("student").each(function(i){ //查找所有student節(jié)點(diǎn)并遍歷
                var age = $(this).children("age"); //取得子節(jié)點(diǎn)
                var age_value = age.text();  //取節(jié)點(diǎn)文本
                console.log(age_value);  //id的值
                console.log($(this).attr("email"));  //顯示student的屬性
        })
}


//下面這種寫(xiě)法也對(duì)哦
$.get("xml.xml",function(xml){
         $(xml).find("student").each(function(i,val){
             var age = $(val).children("age");
             var age_value = age.html();
             console.log(age_value);   
             console.log($(val).attr("email"));
         })
     })

結(jié)果如圖所示:

console2.png

通過(guò)上面的代碼,能成功獲取到相應(yīng)的數(shù)據(jù),接下來(lái)就可以將解析出來(lái)的數(shù)據(jù)添加到已有的HTML文件中。

禁用緩存

這個(gè)問(wèn)題在書(shū)上看到,具體實(shí)踐中也沒(méi)有碰到過(guò),所以就先記錄下來(lái)把。
我們?cè)陧?xiàng)目中經(jīng)常會(huì)遇到一個(gè)問(wèn)題,就是數(shù)據(jù)已經(jīng)更新了,但傳遞的還是以前的數(shù)據(jù),要避免這種情況,就應(yīng)該禁用緩存。

  • 如果是使用$.ajax的方法,只需要在cache屬性中設(shè)置false, 要注意false是布爾值不是字符串
  • 如果是使用$.post的方法,默認(rèn)就是禁用緩存的。
  • 如果是使用$.get的方法,可以通過(guò)設(shè)置時(shí)間戳來(lái)避免緩存:
 $.get('ajax.xml?'+(+new Date).function(xml){
        //...
});
//(+new Date)等價(jià)于 new Date().getTime()

注:之所以不用隨機(jī)數(shù),是因?yàn)殡S機(jī)數(shù)大量使用會(huì)出現(xiàn)重復(fù)的概率挺大,而用時(shí)間戳就不會(huì)出現(xiàn)這種情況。

加載不上?

  • 檢查一下Content-Type有沒(méi)有設(shè)置好?(看文中的 Content-Type設(shè)置 部分)
  • 檢查一下XML結(jié)構(gòu)是否正確(看文中 XML語(yǔ)法 部分)
  • 用ajax加載的時(shí)候一定要起服務(wù),不能在本地環(huán)境下使用,否則會(huì)報(bào)錯(cuò)
error.png
  • 解析xml的jq語(yǔ)法有沒(méi)有錯(cuò)誤,提示的是,如果子節(jié)點(diǎn)有很多個(gè),要使用each遍歷,可以使用$(this)獲取當(dāng)前節(jié)點(diǎn),也可以使用$(val)獲取當(dāng)前節(jié)點(diǎn),為什么是$(val),是因?yàn)閑ach里面的第二個(gè)參數(shù)val出來(lái)的是DOM元素,所以要進(jìn)行DOM元素和JQ元素的轉(zhuǎn)化。

  • 還有就是如果數(shù)據(jù)不更新,是不是沒(méi)有禁用緩存。

(目前想到這些,還有在不定期更新哦~~~~~)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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