SAX解析XML

SAX解析原理:

  通过读取器读取xml文档,当读到了文档某一部分时(文档的开始,元素的开始、元素的结束、文档的结束),都会调用事件处理器的队友方法,读到的数据,以参数的形式传递给对应的方法。

SAX解析器:

SAXParser saxParserFactory=  SAXParserFactory.newInstance().newSAXParser();

xml

<?xml version="1.0" encoding="UTF-8"?>
<exam>
	<student examid="222">
		<name>张三</name>
		<location>沈阳</location>
		<grade>89</grade>
	</student>

	<student idcard="333">
		<name>李四</name>
		<location>大连</location>
		<grade>110</grade>
	</student>

</exam>

代码示例:

package com.bcrj.domain;

public class Student {
	private String name;
	private String location;
	private String grade;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getLocation() {
		return location;
	}

	public void setLocation(String location) {
		this.location = location;
	}

	public String getGrade() {
		return grade;
	}

	public void setGrade(String grade) {
		this.grade = grade;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", location=" + location + ", grade="
				+ grade + "]";
	}

	
}

  

 

package com.bcrj.sax;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;

import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import com.bcrj.domain.Student;

public class SAXTest {
	public static void main(String[] args) throws ParserConfigurationException,
			SAXException, IOException {
		SAXParser saxParserFactory = SAXParserFactory.newInstance()
				.newSAXParser();
		saxParserFactory.parse("src/students.xml", new myContentHandler3());

	}

}

// 打印文本内容
class myContentHandler1 extends DefaultHandler {

	@Override
	public void startDocument() throws SAXException {
		System.out.println("开始解析文档开始");

	}

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes atts) throws SAXException {
		System.out.println("开始解析元素:" + qName);

	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		System.out.println("文本内容---" + new String(ch, start, length));
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		// TODO Auto-generated method stub

	}

	@Override
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub

	}

}

// 打印某一个元素文本,第二个location
class myContentHandler2 extends DefaultHandler {
	int index = 0;
	boolean isLocation = false;

	@Override
	public void startDocument() throws SAXException {
		System.out.println("开始解析文档开始");

	}

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes atts) throws SAXException {
		// System.out.println("开始解析元素:" + qName);
		if (qName.equals("location")) {
			index++;
			isLocation = true;
		}
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		if (isLocation && index == 2) {
			System.out.println("文本内容---" + new String(ch, start, length));
		}
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		isLocation = false;
	}

	@Override
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub

	}

}

// 读取XML中内容,封装到JavaBean中
class myContentHandler3 extends DefaultHandler {

	Student stu = null;
	String currentTagName = null;

	List<Student> students = new ArrayList<Student>();

	@Override
	public void startDocument() throws SAXException {
		System.out.println("开始解析文档开始");

	}

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes atts) throws SAXException {
		if ("student".equals(qName)) {
			stu = new Student();
		}
		currentTagName = qName;
		// System.out.println("开始解析元素:" + qName);
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		if("name".equals(currentTagName)){
			stu.setName(new String(ch,start,length));
		}
		if("location".equals(currentTagName)){
			stu.setLocation(new String(ch,start,length));
		}
		if("grade".equals(currentTagName)){
			stu.setGrade(new String(ch,start,length));
		}
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		if (qName.equals("student")) {
			students.add(stu);
			stu = null;
		}
		currentTagName = null;
	}

	@Override
	public void endDocument() throws SAXException {
		System.out.println("解析到了文档的结束-----打印Student");
		for(Student st:students){
			System.out.println(st);
		}
	}

}

  

posted @ 2014-04-10 21:21  大鹏520  阅读(172)  评论(0编辑  收藏  举报