Welcom to RO_wsy's blog

SAX解析XML文档

SAX采用事件处理器的方式解析XML文档,利用SAX解析XML文档,涉及两个部分:解析器和事件处理器

解析器可以使用JAXP的API进行创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档

解析器在采用SAX方式解析某个XML文档时,它只要解析到XML文档的一个组成部分,都回去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前XML文件内容作为方法的参数传递给事件处理器

事件处理器有程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到SAX解析器得到的数据,从而可以决定如何对数据进行处理

通过一个实例体验一下,本实例通过读取一个book.xml文档,将book中内容封装到一个Book对象中,并将多个Book对象放入LIst中返回,实例代码如下:

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

import javax.sql.rowset.spi.XmlReader;
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.XMLReader;
import org.xml.sax.helpers.DefaultHandler;


public class SAXParesXML {

	/**
	 * sax parse
	 * @throws SAXException 
	 * @throws ParserConfigurationException 
	 * @throws IOException 
	 */
	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
		
		// 创建解析工厂
		SAXParserFactory factory = SAXParserFactory.newInstance();
		
		// 得到解析器
		SAXParser sp = factory.newSAXParser();
		
		// 得到读取器
		XMLReader reader = sp.getXMLReader();
		
		//设置内容处理器
		BeanListHandler beanListHandler = new BeanListHandler();
		reader.setContentHandler(beanListHandler);
		
		//读取xml文档内容
		reader.parse("src/book.xml");
		
		List<Book> books = beanListHandler.getBooks();
		
		//遍历输出
		//...
	}

}

// 把xml的每一本书封装到Book对象中,并把多个Book对象封装到List中返回
class BeanListHandler extends DefaultHandler {

	private List books = new ArrayList();
	private String currentTag;
	private Book book;
	
	public List getBooks() {
		return books;
	}
	
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		if ("book".equals(currentTag)) {
			book = new Book();
		}
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		if ("name".equals(currentTag)) {
			book.setName(new String(ch, start, length));
		}
		
		if ("author".equals(currentTag)) {
			book.setAuthor(new String(ch, start, length));
		}
		
		if ("price".equals(currentTag)) {
			book.setPrice(new String(ch, start, length));
		}
	}
	
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		if (qName.equals("book")) {
			books.add(book);
			book = null;
		}
		
		currentTag = null;
	}

}


Book类代码如下:

public class Book {
	private String name;
	private String author;
	private String price;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public String getPrice() {
		return price;
	}
	public void setPrice(String price) {
		this.price = price;
	}
	
}


book.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
	<book>
		<name>C++ l</name>
		<author>Lippman</author>
		<title>cpp</title>
	</book>
	<book>
		<name>C++ h</name>
		<author>houjie</author>
		<title>stl</title>
	</book>
</bookstore>

 

posted @ 2012-12-01 17:35  RO_wsy  阅读(158)  评论(0编辑  收藏  举报