當前位置:學者齋 >

IT認證 >IBM認證 >

XML認證知識點:SAX Parser

XML認證知識點:SAX Parser

讀取和操縱 XML(XML培訓 程式設計語言培訓 ) 檔案的標準方法是 DOM(“文件物件模型”)。遺憾的是,這種方法需要讀取整個檔案並將它儲存到樹結構中,因而效率不高、緩慢,並且會過度使用資源。

XML認證知識點:SAX Parser

一種替代方法是使用 Simple API for XML 或 SAX。SAX 允許正在讀取文件時處理該文件,這避免了在採取操作之前需要等待儲存文件的所有內容。

SAX 是由 XML-DEV 郵件列表的成員開發的,Java 版本由 David Megginson 維護。他們的目的是提供一種更自然的方法來使用 XML,這種方法不會涉及到使用 DOM 的那種開銷。

結果是基於事件的 API。解析器將事件(譬如,元素的開始或結束)傳送給處理資訊的事件處理程式。然後,應用程式自己可以處理資料。雖然原始文件保持不變,但 SAX 提供了操縱資料的方法,然後會將該方法導向另一個過程或文件。

對於 SAX,沒有官方的標準;全球資訊網(W3C)或其它官方組織不維護 SAX,但在 XML 社群中,它是一個事實上的標準。

  SAX 處理是如何工作的

SAX 分析經過其的 XML 流,這非常象老式的自動收報機紙條。考慮以下 XML 程式碼片斷:

UNIX

color

一般情況下,SAX 處理器分析這段程式碼將生成以下事件:

Start document

Start element (samples)

Characters (white space)

Start element (server)

Characters (UNIX)

End element (server)

Characters (white space)

Start element (monitor)

Characters (color)

End element (monitor)

Characters (white space)

End element (samples)

SAX API 允許開發者捕獲這些事件,並對它們進行操作。

SAX 處理涉及以下幾步:

建立事件處理程式。

建立 SAX 解析器。

將事件處理程式分配給解析器。

對文件進行解析,將每個事件傳送給處理程式。

  在SAX與DOM之間,如何選擇

選擇 DOM 還是 SAX,這取決於幾個因素:

應用程式的目的:如果必須對資料進行更改,並且作為 XML 將它輸出,則在大多數情況下,使用 DOM。與使用 XSL 轉換來完成的簡單結構更改不一樣,如果是對資料本身進行更改,則尤其應該使用 DOM。

資料的數量:對於大檔案,SAX 是更好的選擇。

將如何使用資料:如果實際上只使用一小部分資料,則使用 SAX 將資料抽取到應用程式中,這種方法更好些。另一方面,如果知道將需要向後引用已經處理過的資訊,則 SAX 可能不是正確的'選擇。

需要速度:通常,SAX 實現比 DOM 實現快。

記住 SAX 和 DOM 不是互斥的,這一點很重要。可以使用 DOM 來建立事件的 SAX 流,可以使用 SAX 來建立 DOM 樹。事實上,大多數解析器實際常常使用 SAX 來建立 DOM 樹!

  使用 JAXP 來建立解析器

接下來我們來看一下JAXP的SAX Parser是怎麼樣工作的。

首先宣告 XMLReader xmlReader。然後使用 SAXParserFactory 來建立 SAXParser。正是 SAXParser 給您了 XMLReader。

import ultHandler;

import arser;

import arserFactory;

import eader;

public class SurveyReader extends DefaultHandler

{

public SurveyReader() {

}

public static void main (String args[]) {

XMLReader xmlReader = null;

try {

SAXParserFactory spfactory =

nstance();

alidating(false); //設定驗證選項,

如果您的XML檔案是有效文件的話,

就不用驗證.這將提高處理速度

SAXParser saxParser = AXParser();

xmlReader = MLReader();

} catch (Exception e) {

tln(e);

(1);

}

}

}

設定內容處理程式

一旦建立瞭解析器,則需要將 SurveyReader 設定為內容處理程式,以便於其接收事件。

xmlReader 的 setContentHandler() 方法完成這項工作。

...

xmlReader = MLReader();

ontentHandler(new SurveyReader());

} catch (Exception e) {

...

當然,對於內容處理程式,這不是唯一的選項。

解析 InputSource

為了對檔案進行實際地解析,需要 InputSource。這個 SAX 類封裝了所有將要處理的資料,所以不必擔心它來自哪裡。

現在,準備對檔案進行實際解析。應用程式將封裝在 InputSource 中的檔案傳遞給 parse(),然後應用程式會繼續執行。

...

import tSource;

...

xmlReader = MLReader();

ontentHandler(new SurveyReader());

InputSource source = new InputSource("");

e(source);

} catch (Exception e) {

...

可以編譯和執行該程式,但這時應該什麼也沒有發生,因為應用程式還沒有定義任何事件。

  建立 ErrorHandler

當然總會有可能在試圖進行解析時,資料有問題。在這樣的情況下,有一個處理程式來處理錯誤和內容將是有幫助的。

就如同創建內容處理程式一樣,可以創建出錯處理程式。通常,將作為 ErrorHandler 的單獨例項來建立它,但為了簡化該示例,出錯處理正是包含在 SurveyResults 中。由於該類繼承了 DefaultHandler 且沒有擴充套件 ContentHandler,所以這種雙重用法是可能的。

需要關注的事件有三個:警告、錯誤和致命錯誤。

...

import arseException;

public class SurveyReader extends DefaultHandler

{

public SurveyReader() {

}

public void error (SAXParseException e) {

tln("Error parsing the file: "+essage());

}

public void warning (SAXParseException e) {

tln("Problem parsing the file: "+essage());

}

public void fatalError (SAXParseException e) {

tln("Error parsing the file: "+essage());

tln("Cannot continue.");

(1);

}

}

....

ontentHandler(new SurveyReader());

rrorHandler(new SurveyReader());

//設定 ErrorHandler

InputSource source = new InputSource("");

....

public static void main (String args[]) {

...

  SAX 事件

以下事件是常用的;它們都在 包的 HandlerBase 類中定義。

startDocument 表示文件開始。

endDocument 表示文件結束。

startElement 表示元素開始。當一對標記中的起始標記中的所有內容被處理後,解析器 激發此事件。包括了標記名和其屬性。

endElement 表示元素結束。

characters 包含字元資料,類似於 DOM 的一個 Text 節點。

還有更多的 SAX 事件:

ignorableWhitespace 此事件類似於我們前面所討論的無用 DOM 節點。它與 character 事件的區別,好處是:如果您不需要空格符,您可以通過忽略這個事件來忽略所有的空格符。

warning、error 和 fatalError 這三個事件表示瞭解析錯誤。您可根據需要來響應它們。

setDocumentLocator 這個事件允許您儲存一個 SAX 的 Locator 物件。Locator 物件可以用來找出在文件中確切發生事件的地方。


標籤: 知識點 XML SAX Parser
  • 文章版權屬於文章作者所有,轉載請註明 https://xuezhezhai.com/zh-tw/itrz/ibm/5go03w.html