Java SAX 解析器 - 概述



Java SAX (Simple API for XML) 是一種基於事件的解析器,用於解析 XML 文件。與 DOM 解析器不同,SAX 解析器不會建立解析樹。它不會將整個文件載入到記憶體中,而是讀取 XML 文件,並在遇到元素、屬性、文字內容和其他資料項時以事件的形式通知客戶端程式。這些事件由事件處理程式中實現的方法處理。

SAX 解析器做什麼?

SAX 解析器對客戶端程式執行以下操作:

  • 從上到下讀取 XML 文件並識別標記。

  • 按標記出現的順序處理標記。

  • 向解析器報告標記的性質。

  • 根據識別的標記呼叫事件處理程式中的回撥方法。

何時使用 Java SAX 解析器?

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

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

  • 文件巢狀不深。

  • 您的 XML 文件非常大。

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

  • 您擁有流資料(資料在解析器看到後即可使用)。

優點

以下是 Java SAX 解析器的一些優點:

  • 佔用記憶體更少
  • 它比 DOM 解析器更快。因為我們不需要等待整個文件載入到記憶體中。
  • 您仍然可以處理大於系統記憶體的 XML 文件。

缺點

以下是 Java SAX 解析器的一些缺點:

  • 無法隨機訪問 XML 文件。

  • 無法建立 XML 文件。
  • 如果要跟蹤解析器已看到的的資料或更改專案的順序,則必須編寫程式碼並自行儲存資料。

ContentHandler 介面

ContentHandler 介面是 org.xml.sax 包中的主要介面。大多數應用程式程式實現此介面以執行基本的解析事件。這些事件包括文件的開始和結束、元素的開始和結束以及字元資料。我們必須實現並註冊一個處理程式才能在 XML 文件中執行任何任務。

有一些內建類,即 DefaultHandler、DefaultHandler2、ValidatorHandler,它們實現了 ContentHandler 介面。我們可以使用這些類來實現我們使用者自定義的處理程式。

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

方法 描述
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 介面

Attributes 介面位於 org.xml.sax 包中。此介面用於元素中指定的 XML 屬性列表。以下是 Attributes 介面最常用的方法:

方法 描述
int getLength() 返回屬性數量。
int getIndex(String qName) 返回屬性在列表中的索引,如果不存在則返回 -1。
String getQName(int index) 按索引返回屬性名稱,如果索引超出範圍則返回 null。
String getType(int index) 按索引返回屬性的型別(“CDATA”、“ID”、“IDREF”等)。
String getValue(int index) 按索引返回屬性的值,如果索引超出範圍則返回 null。
String getValue(String qName) 按名稱返回屬性的值,如果名稱不存在則返回 null。
廣告