使用SAX读取XML文件
1.原理
SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
2.优缺点
优点:
可以边读边解析,当XML文件过大时候相较于DOM消耗的内存较小
缺点:
只能读取不能修改
只能按顺序读取不走回头路
3.解析步骤
1、得到xml文件对应的资源,可以是xml的输入流,文件和uri
2、得到SAX解析工厂(SAXParserFactory)
3、由解析工厂获得一个SAX解析器(SAXParser)
4、传入输入流和handler给解析器,调用parse()解析
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//得到SAX解析工厂(SAXParserFactory)
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
//获得一个SAX解析器(SAXParser)
SAXParser saxParser = saxParserFactory.newSAXParser();
//传入输出流和handler给解析器,调用parse解析
MyHandle myHandle = new SAXReadXml().new MyHandle();
saxParser.parse(SAXReadXml.class.getResourceAsStream("/person.xml"),myHandle);
for (Person person : myHandle.persons){
System.out.println(person);
}
}
1.生成一个person.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
<person>
<name>李四</name>
<age>88</age>
</person>
<person>
<name>张三</name>
<age>58</age>
</person>
</persons>
2.Person类
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
3.Myhandler类继承DefaultHandler并重写相关方法
public class MyHandle extends DefaultHandler{
//用于存放Person类的容器
public List<Person> persons;
public Person person;
//用来获取标签便于做对应操作
private String tag;
/**
* 收到通知开始读取文档
* 可以做些初始化话的操作(如:创建输出文件)
* */
@Override
public void startDocument() throws SAXException {
}
/**
* 当标签为persons时创建容器
* 当标签为person时创建一个person对象
* 其他情况将qName值赋值给tag
* */
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.trim().equals("person")){
person = new Person();
}else if(qName.trim().equals("persons")){
persons = new ArrayList<>();
}else{
tag = qName.trim();
}
}
/**
* 根据tag不同的值获取对应的数据并对person进行设值
* */
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (tag != null && tag.equals("name")){
person.setName(new String(ch,start,length));
}else if (tag != null && tag.equals("age")){
person.setAge(new Integer(new String(ch,start,length)));
}
}
/**
* 当结束标志位person时将该person对象加入到容器中
* */
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.trim().equals("person")){
persons.add(person);
}
tag = null;
}
/**
* 收到通知读取文档结束
* */
@Override
public void endDocument() throws SAXException {
}
}
4.运行结果图
个人笔记,如有错误还望指正!