SAX 解析器 - 概述



SAX(XML 的簡單 API)是一種基於事件的 XML 文件解析器。與 DOM 解析器不同,SAX 解析器不建立解析樹。SAX 是 XML 的流式介面,這意味著使用 SAX 的應用程式會收到有關正在處理的 XML 文件的事件通知 - 每次一個元素和屬性,按順序從文件頂部開始,以 ROOT 元素的關閉結束。

  • 從上到下讀取 XML 文件,識別構成格式良好的 XML 文件的標記。

  • 標記按其在文件中出現的順序進行處理。

  • 嚮應用程式報告解析器遇到的標記的性質,並在其發生時報告。

  • 應用程式提供一個“事件”處理程式,該處理程式必須向解析器註冊。

  • 當識別出標記時,處理程式中的回撥方法將使用相關資訊被呼叫。

何時使用?

您應該在以下情況下使用 SAX 解析器:

  • 您可以從上到下以線性方式處理 XML 文件。

  • 文件巢狀不深。

  • 您正在處理一個非常大的 XML 文件,其 DOM 樹將消耗大量記憶體。典型的 DOM 實現使用十個位元組的記憶體來表示一個位元組的 XML。

  • 要解決的問題只涉及 XML 文件的一部分。

  • 資料在解析器看到後立即可用,因此 SAX 非常適合透過流到達的 XML 文件。

SAX 的缺點

  • 由於 XML 文件以僅向前的方式處理,因此我們無法隨機訪問它。

  • 如果您需要跟蹤解析器已看到的或更改專案順序的資料,則必須自己編寫程式碼並存儲資料。

ContentHandler 介面

此介面指定 SAX 解析器用於通知應用程式程式它已看到的 XML 文件元件的回撥方法。

  • void startDocument() - 在文件開始時呼叫。

  • void endDocument() - 在文件結束時呼叫。

  • void startElement(String uri, String localName, String qName, Attributes atts) - 在元素開始時呼叫。

  • void endElement(String uri, String localName,String qName) - 在元素結束時呼叫。

  • void characters(char[] ch, int start, int length) - 遇到字元資料時呼叫。

  • void ignorableWhitespace( char[] ch, int start, int length) - 當存在 DTD 且遇到可忽略的空白時呼叫。

  • void processingInstruction(String target, String data) - 識別處理指令時呼叫。

  • void setDocumentLocator(Locator locator)) - 提供一個 Locator,可用於識別文件中的位置。

  • void skippedEntity(String name) - 遇到未解析的實體時呼叫。

  • void startPrefixMapping(String prefix, String uri) - 定義新的名稱空間對映時呼叫。

  • void endPrefixMapping(String prefix) - 名稱空間定義結束其作用域時呼叫。

Attributes 介面

此介面指定用於處理與元素關聯的屬性的方法。

  • int getLength() - 返回屬性的數量。

  • String getQName(int index)

  • String getValue(int index)

  • String getValue(String qname)

廣告

© . All rights reserved.