在XMLReader接受XML文檔,並對讀入的xml檔案進行解析,解析開始之前,需要向XMLReader註冊一個ContentHandler,也就是相當於一個事件監聽器,在ContentHandler中定義了很多方法,當XMLReader讀到合適的內容,就會拋出相應的事件,並把這個事件的處理權代理給ContentHandler,調用其相應的方法進行響應。
ContentHandler是一個介面,當處理特定的XML檔案的時候,需要為其建立實現了此介面的類來處理特定的事件。而org.xml.sax.helpers.DefaultHandler類實現了此介面,所以我們只要繼承DefaultHandler,並覆蓋其中的方法即可。具體常用的幾個方法在下面程式中有詳細注釋:
package xml;
import java.io.FileReader;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;;
public class SaxTest extends DefaultHandler{
 public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
  
  XMLReader xr=XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
  xr.setContentHandler(new SaxTest());
  xr.parse(new InputSource(new FileReader("test.xml")));
 }
//在文檔開始的時候調用此方法
 public void startDocument() throws SAXException {
  
  System.out.println("startDocument: ");
 
 }
 //在文檔結束的時候調用此方法
 public void endDocument() throws SAXException {
  
  System.out.println("enddocument: ");
 }
//在遇到開始標籤時調用此方法,
//其中參數中的namespaceURI就是名域,localName是標籤名,qName是標籤的修飾首碼,當沒有使用名域的時候,這兩個參數都未null。而atts是這個標籤所包含的屬性列表。通過atts,可以得到所有的屬性名稱和相應的值
 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
  
  System.out.println("startElement: "+localName);
 }
//遇到結束標籤時調用此方法
 public void endElement(String uri, String localName, String qName) throws SAXException {
  
  System.out.println("endElement: "+localName);
 }
//當遇到標籤中的字串時,調用這個方法,它的參數是一個字元數組,以及讀到的這個字串在這個數組中的起始位置和長度
 public void characters(char[] ch, int start, int length) throws SAXException {
  
  String data=new String(ch,start,length);
  System.out.println(data);
 
 }
}
當我們建立如下test.xml檔案時
test.xml
-------------------
<?xml version="1.0"?>
<School>
 <Student>
  <ID>123456</ID>
  <Address>408</Address>
  <Name>wxm</Name>
  <Sex>male</Sex>
 </Student>
</School>
-------------------
運行程式,輸出結果如下:
startDocument: 
startElement: School
 
startElement: Student
  
startElement: ID
123456
endElement: ID
  
startElement: Address
408
endElement: Address
  
startElement: Name
wxm
endElement: Name
  
startElement: Sex
male
endElement: Sex
 
endElement: Student
endElement: School
enddocument: 
----------------
END!