使用JAXP實作SAX解析
sax是一個用于處理xml驅動的“推”模型,是一個得到廣泛認可的API。它不像DOM一樣建立一個完整的文檔樹,而是在讀取文檔時激活一系列事件。這些事件被推給事件處理器,然後由事件處理器提供對文檔的通路。
sax解析隻用于查找、讀取XML資料。不支援增删改!
步驟
1.擷取到解析器工廠類對象
2.擷取解析類對象
3.建立事件處理器
4.傳入解析檔案與事件處理器,開始解析
【其中比較麻煩的就是建立事件處理器,不過也有套路】
代碼試看:
import java.io.File;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
public class SAXDemo02 {
public static void main(String[] args) throws Exception {
// 1.擷取到解析器工廠類對象
SAXParserFactory parserFactory = SAXParserFactory.newInstance();
// 2.擷取解析類對象
SAXParser parser = parserFactory.newSAXParser();
// 3.建立事件處理器
StudentHandler sh = new StudentHandler();
// 4.傳入解析檔案與事件處理器,開始解析
parser.parse(new File("scores.xml") , sh);
//從事件處理器擷取已讀取到的内容
List<Student> list = sh.getStudentList();
Iterator<Student> it = list.iterator();
while (it.hasNext()) {
Student student = it.next();
System.out.println(student);
}
}
}
下面看事件處理器的代碼
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* 了解此事件處理器,重點是知道解析器調用方法的順序。
* 【可以自己寫入輸出語句,觀察一下!!!!】
*/
public class StudentHandler extends DefaultHandler{
//用于存儲讀取資料的集合
private List<Student>studentList;
private Student student;
//記錄讀到的标簽
private String nowTag;
public List<Student> getStudentList() {
return studentList;
}
@Override
public void startDocument() throws SAXException {
studentList = new ArrayList<>();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equals("student")) {
student = new Student();
}
nowTag = qName;
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equals("student")) {
studentList.add(student);
}
//防止讀到結束标簽時重新讀取
nowTag = "";
}
public void characters(char[] ch, int start, int length) throws SAXException {
String text = new String(ch, start, length);
if (nowTag.equals("id")) {
student.setId(Integer.parseInt(text));
}else if (nowTag.equals("name")) {
student.setName(text);
}else if (nowTag.equals("subject")) {
student.setSubject(text);
}else if (nowTag.equals("score")) {
student.setScore(Integer.parseInt(text));
}
}
}