在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!