分分钟get使用JAXP实现SAX解析

来源:互联网 发布:一万年来谁著史 知乎 编辑:程序博客网 时间:2024/05/28 03:03

使用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));        }    }}
阅读全文
0 0
原创粉丝点击