複製鏈接
請複製以下鏈接發送給好友

XML解析器

鎖定
所有現代瀏覽器都內建了供讀取和操作 XML 的 XML 解析器,解析器把 XML 轉換為 XML DOM 對象 - 可通過 JavaScript 操作的對象。
中文名
XML解析器
外文名
xml parser
基本釋義
讀取和操作XML的解析器
出現在
瀏覽器
歸屬學科
計算機編程
應    用
網頁開發

XML解析器介紹

所有現代瀏覽器都內建了供讀取和操作 XML 的 XML 解析器。解析器把 XML 轉換為 XML DOM 對象 - 可通過 JavaScript 操作的對象。
DOM、SAX都是一組解析XML文檔的規範,其實就是接口,這説明需要有實現者能使用,而解析器就是對DOM、SAX的實現。一般解析器都會實現DOM、SAX兩個規範。
  • Crimson(sun):JDK1.4之前,Java使用的解析器。性能效差。
  • Xerces(IBM):IBM開發的DOM、SAX解析器,現在已經由Apache基金會維護,是當前最為流行的解析器之一。在1.5之後,已經添加到JDK之中,也是JAXP的默認使用解析器,但不過在JDK中的包名與Xerces不太一樣。例如:org.apache.xerces包名改為了com.sun.org.apache.xerces.internal包名,也就是説JDK1.5中的Xerces是被包裝後的XML解析器,但二者區別很小。
  • Aelfred2(dom4j):DOM4J默認解析器,當DOM4J找不到解析器時會使用他自己的解析器。

XML解析器操作文檔

XML文檔也是數據的一種,對數據的操作也不外乎是“增刪改查”,也被大家稱之為“CRUD”。
  • C:Create;
  • R:Retrieve;
  • U:Update;
  • D:Delete

XML解析器解析技術

XML解析方式分為兩種:DOM(Document Object Model)和SAX(Simple API for XML)。這兩種方式不是針對Java語言來解析XML的技術,而是跨語言的解析方式。例如DOM還在JavaScript中存在。
DOM是W3C組織提供的解析XML文檔的標準接口,而SAX是社區討論的產物,是一種事實上的標準。
DOM和SAX只是定義了一些接口,以及某些接口的缺省實現,而這個缺省實現只是用空方法來實現接口。一個應用程序如果需要DOM或SAX來訪問XML文檔,還需要一個實現了DOM或SAX的解析器,也就是説這個解析器需要實現DOM或SAX中定義的接口。提供DOM或SAX中定義的功能。

XML解析器解析原理

XML解析器DOM

使用DOM要求解析器把整個XML文檔裝載到一個Document對象中。Document對象包含文檔元素,即根元素,根元素包含N個子元素。
一個XML文檔解析後對應一個Document對象,這説明使用DOM解析XML文檔方便使用,因為元素與元素之間還保存着結構關係。
優先:使用DOM,XML文檔的結構在內存中依然清晰。
缺點:如果XML文檔過大,那麼把整個XML文檔裝載進內存,可能會出現內存溢出的現象。

XML解析器SAX

DOM會一行一行的讀取XML文檔,最終會把XML文檔所有數據存放到Document對象中。SAX也是一行一行的讀取XML文檔,但是當XML文檔讀取結束後,SAX不會保存任何數據,同時整個解析XML文檔的工作也就結束了。
但是,SAX在讀取一行XML文檔數據後,就會給感興趣的用户一個通知。例如當SAX讀取到一個元素的開始時,會通知用户當前解析到一個元素的開始標籤。而用户可以在整個解析的過程中完成自己的業務邏輯,當SAX解析結束,不會保存任何XML文檔的數據。
優先:使用SAX,不會佔用大量內存來保存XML文檔數據,效率高。
缺點:當解析到一個元素時,上一個元素的信息已經丟棄,也就是説沒有保存元素與元素之間的結構關係,這也大大限制了SAX的使用範圍。如果只是想查詢XML文檔中的數據,那麼使用SAX是最佳選擇。

XML解析器解析 XML

所有現代瀏覽器都有讀取和操作 XML 的內建 XML 解析器。
解析器把 XML 載入內存,然後把它轉換為可通過 JavaScript 訪問的XML DOM 對象。
微軟的 XML 解析器與其他瀏覽器中的解析器之間,存在一些差異。微軟的解析器支持 XML 文件和 XML 字符串(文本)的加載,而其他瀏覽器使用單獨的解析器。不過,所有的解析器都包含遍歷 XML 樹、訪問插入及刪除節點(元素)及其屬性的函數。 [1] 

XML解析器文檔

下面的代碼片段把 XML 文檔解析到 XML DOM 對象中:
if (window.XMLHttpRequest)  {// code for IE7+, Firefox, Chrome, Opera, Safari  xmlhttp=new XMLHttpRequest();  }else  {// code for IE6, IE5  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");  }xmlhttp.open("GET","books.xml",false);xmlhttp.send();xmlDoc=xmlhttp.responseXML; 

其他方法 1:通過微軟的 XML 解析器來加載 XML
微軟的 XML 解析器內建於 Internet Explorer 5 以及更高的版本中。
下面的 JavaScript 片段把一個 XML 文檔載入解析器中:
var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");xmlDoc.async="false";xmlDoc.load("note.xml");

  1. 上面代碼的第一個行創建一個空的微軟 XML 文檔對象。
  2. 第二行關閉異步加載,這樣確保在文檔完全加載之前解析器不會繼續腳本的執行。
  3. 第三行告知解析器加載名為 "note.xml" 的 XML 文檔。
其他方法 2:在 Firefox 及其他瀏覽器中的 XML 解析器
下面的 JavaScript 片段把 XML 文檔 ("note.xml") 載入解析器:
var xmlDoc=document.implementation.createDocument("","",null);xmlDoc.async="false";xmlDoc.load("note.xml");

  1. 上面代碼的第一個行創建一個空的XML 文檔對象。
  2. 第二行關閉異步加載,這樣確保在文檔完全加載之前解析器不會繼續腳本的執行。
  3. 第三行告知解析器加載名為 "note.xml" 的 XML 文檔。 [1] 

XML解析器字符串

下面的 JavaScript 代碼片段把 XML 字符串解析到 XML DOM 對象中(把字符串 txt 載入解析器):
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);  }

註釋:Internet Explorer 使用 loadXML() 方法來解析 XML 字符串,而其他瀏覽器使用DOMParser 對象。
註釋:loadXML()方法用於加載字符串(文本),load()用於加載文件。 [1] 

XML解析器跨域訪問

出於安全方面的原因,現代的瀏覽器不允許跨域的訪問。
這意味着,網頁以及它試圖加載的 XML 文件,都必須位於相同的服務器上。
W3School 的實例所打開的 XML 文件位於 W3School 的域上。
假如你打算在自己的網頁上使用上面的例子,則必須把 XML 文件放到自己的服務器上。否則,xmlDoc.load() 將產生錯誤 "Access is denied"。 [1] 
參考資料