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