SAX

本文介绍了一种使用SAX解析XML文件的方法,并详细解释了如何将其转换为VO实例。通过继承DefaultHandler类,实现了针对特定XML结构的事件处理,最终将XML数据解析为对象实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SAX是Simple API for XML的缩写

用于处理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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值