XML解析器

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

介紹

所有現代瀏覽器都內建了供讀取和操作 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 對象中:

其他方法 1:通過微軟的 XML 解析器來載入 XML

微軟的 XML 解析器內建於 Internet Explorer 5 以及更高的版本中。

下面的 JavaScript 片段把一個 XML 文檔載入解析器中:

上面代碼的第一個行創建一個空的微軟 XML 文檔對象。

第二行關閉異步載入,這樣確保在文檔完全載入之前解析器不會繼續腳本的執行。

第三行告知解析器載入名為 "note.xml" 的 XML 文檔。

1.

上面代碼的第一個行創建一個空的微軟 XML 文檔對象。

2.

第二行關閉異步載入,這樣確保在文檔完全載入之前解析器不會繼續腳本的執行。

3.

第三行告知解析器載入名為 "note.xml" 的 XML 文檔。

其他方法 2:在 Firefox 及其他瀏覽器中的 XML 解析器

下面的 JavaScript 片段把 XML 文檔 ("note.xml") 載入解析器:

上面代碼的第一個行創建一個空的XML 文檔對象。

第二行關閉異步載入,這樣確保在文檔完全載入之前解析器不會繼續腳本的執行。

第三行告知解析器載入名為 "note.xml" 的 XML 文檔。

1.

上面代碼的第一個行創建一個空的XML 文檔對象。

2.

第二行關閉異步載入,這樣確保在文檔完全載入之前解析器不會繼續腳本的執行。

3.

第三行告知解析器載入名為 "note.xml" 的 XML 文檔。

字元串

下面的 JavaScript 代碼片段把 XML 字元串解析到 XML DOM 對象中(把字元串 txt 載入解析器):

注釋:Internet Explorer 使用 loadXML() 方法來解析 XML 字元串,而其他瀏覽器使用DOMParser 對象。

注釋:loadXML()方法用於載入字元串(文本),load()用於載入檔案。

跨域訪問

出於安全方面的原因,現代的瀏覽器不允許跨域的訪問。

這意味著,網頁以及它試圖載入的 XML 檔案,都必須位於相同的伺服器上。

W3School 的實例所打開的 XML 檔案位於 W3School 的域上。

假如你打算在自己的網頁上使用上面的例子,則必須把 XML 檔案放到自己的伺服器上。否則,xmlDoc.load() 將產生錯誤 "Access is denied"。

相關詞條

相關搜尋

熱門詞條

聯絡我們