用于处理XML文档
一、SAX解析XML的处理方式:
SAX的设计实现与DOM是完全不同的!DOM处理XML文档是基于将XML文档解析成树状模型,放入内存进行处理。
而SAX则是采用基于事件驱动的处理模式,它将XML文档转化成一系列的事件,由单独的事件处理器来决定如何处理。
二、事件处理器:处理事件源在解析过程中产生的不同种类的事件
org.xml.sax.ContentHandler
org.xml.sax.ErrorHandler
org.xml.sax.DTDHandler
org.xml.sax.EntityResolver
三、在SAX接口中,事件源是org.xml.sax包中的XMLReader,它通过parse()方法来开始解析XML文档并根据文档内容产生事件。
在XMLReader中提供setxxxx(ContentHandler等几种不同情况的事件处理器)。
ContentHandler。。。。等几个事件处理器是接口,若使用,需要实现所有的方法。
SAX提供了一个方便实现各种处理器接口的帮助类DefaultHandler。这个类缺省实现了上面提到的4个处理器接口。
这样我们只需继承这个类,然后覆盖我们想要实现的事件处理方法即可。
参考文档:SAX参考文档
读取XML文件并转换为VO实例程序:
(1)xml文件
<?xml version="1.0" encoding="UTF-8"?>
<student>
<name>张三</name>
<age>20</age>
<course>
<cname>数学</cname>
<cteacher>张老师</cteacher>
<score>90</score>
</course>
<course>
<cname>英语</cname>
<cteacher>王老师</cteacher>
<score>91</score>
</course>
</student>
(2)VO
public class StudentVO {
// 学生姓名
private String name;
// 学生年龄
private int age;
// 学生上课的课程集合
private List<CourseVO> courseList = new ArrayList<CourseVO>();
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;
}
public List<CourseVO> getCourseList() {
return courseList;
}
public void setCourseList(List<CourseVO> courseList) {
this.courseList = courseList;
}
public void addCourse(CourseVO course) {
courseList.add(course);
}
}
public class CourseVO {
// 课程名称
private String cname;
// 授课老师
private String cteacher;
// 分数
private int score;
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public String getCteacher() {
return cteacher;
}
public void setCteacher(String cteacher) {
this.cteacher = cteacher;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
(3)事件处理器继承DefaultHandler
/**
* 学生student.xml事件解析器
*/
public class StudentHandler extends DefaultHandler {
private StudentVO student;
private CourseVO course;
private String qvalue;
public StudentHandler(StudentVO student) {
this.student = student;
}
@Override
public void startDocument() throws SAXException {
System.out.println("开始解析student");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("元素['" + qName + "']开始解析");
if ("course".equals(qName))
course = new CourseVO();
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("元素['" + qName + "']解析结束");
if ("name".equals(qName))
student.setName(qvalue);
if ("age".equals(qName))
student.setAge(Integer.parseInt(qvalue));
if ("cname".equals(qName))
course.setCname(qvalue);
if ("cteacher".equals(qName))
course.setCteacher(qvalue);
if ("score".equals(qName))
course.setScore(Integer.parseInt(qvalue));
if ("course".equals(qName)) {
student.addCourse(course);
course = null;
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
qvalue = new String(ch, start, length);
}
@Override
public void endDocument() throws SAXException {
System.out.println("解析student结束");
}
}
(4)执行程序(main方法)
public class StudentSaxApp {
public static void main(String[] args) {
StudentVO studentVO = new StudentVO();
try {
XMLReader reader = XMLReaderFactory.createXMLReader();
StudentHandler handler = new StudentHandler(studentVO);
reader.setContentHandler(handler);
reader.parse("H:/student.xml");
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("学生姓名:" + studentVO.getName());
System.out.println("学生年龄:" + studentVO.getAge());
System.out.println("学生课程数:" + studentVO.getCourseList().size());
for (int i = 0; i < studentVO.getCourseList().size(); i++) {
CourseVO course = studentVO.getCourseList().get(i);
System.out.println("\t第(" + (i + 1) + ")门课程");
System.out.println("\t课程名称:" + course.getCname());
System.out.println("\t课程老师:" + course.getCteacher());
System.out.println("\t课程成绩:" + course.getScore());
}
}
}
(5)输出结果
开始解析student
元素['student']开始解析
元素['name']开始解析
元素['name']解析结束
元素['age']开始解析
元素['age']解析结束
元素['course']开始解析
元素['cname']开始解析
元素['cname']解析结束
元素['cteacher']开始解析
元素['cteacher']解析结束
元素['score']开始解析
元素['score']解析结束
元素['course']解析结束
元素['course']开始解析
元素['cname']开始解析
元素['cname']解析结束
元素['cteacher']开始解析
元素['cteacher']解析结束
元素['score']开始解析
元素['score']解析结束
元素['course']解析结束
元素['student']解析结束
解析student结束
学生姓名:张三
学生年龄:20
学生课程数:2
第(1)门课程
课程名称:数学
课程老师:张老师
课程成绩:90
第(2)门课程
课程名称:英语
课程老师:王老师
课程成绩:91