XML解析器

所有現代瀏覽器都內建了供讀取和操作 XML 的 XML 解析器,解析器把 XML 轉換為 XML DOM 對象 - 可通過 JavaScript 操作的對象。

基本介紹

  • 中文名:XML解析器
  • 外文名:xml parser
  • 基本釋義:讀取和操作XML的解析器
  • 出現在:瀏覽器
  • 歸屬學科:計算機編程
  • 套用:網頁開發
介紹,操作文檔,解析技術,解析原理,DOM,SAX,解析 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文檔也是數據的一種,對數據的操作也不外乎是“增刪改查”,也被大家稱之為“CRUD”。
  • C:Create;
  • R:Retrieve;
  • U:Update;
  • D:Delete

解析技術

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中定義的功能。

解析原理

DOM

使用DOM要求解析器把整個XML文檔裝載到一個Document對象中。Document對象包含文檔元素,即根元素,根元素包含N個子元素。
一個XML文檔解析後對應一個Document對象,這說明使用DOM解析XML文檔方便使用,因為元素與元素之間還保存著結構關係。
優先:使用DOM,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 載入記憶體,然後把它轉換為可通過 JavaScript 訪問的XML DOM 對象。
微軟的 XML 解析器與其他瀏覽器中的解析器之間,存在一些差異。微軟的解析器支持 XML 檔案和 XML 字元串(文本)的載入,而其他瀏覽器使用單獨的解析器。不過,所有的解析器都包含遍歷 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 文檔。

字元串

下面的 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()用於載入檔案。

跨域訪問

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

相關詞條

熱門詞條

聯絡我們