天天看點

分分鐘get使用JAXP實作SAX解析

使用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));
        }
    }
}