分分钟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));
        }
    }
}

猜你喜欢

转载自blog.csdn.net/eternal1d/article/details/77601063