使用SAX读取XML文件时需创建一个类 XMLContentHandler , 这个类继承DefaultHandler类,然后重写里面的这些方法:
startDocument(),endDocument(),startElement(),endElement(),characters()
首先准备一个xml文件,例如book.xml
<?xml version="1.0" encoding="UTF-8"?>
<booklist>
<book isbn="1001" catalog="科幻">
<name lang="en">哈利波特</name>
<author>罗琳</author>
<price>60</price>
<year>2005</year>
</book>
<book isbn="1002" catalog="Web">
<name lang="en">Spring</name>
<author>Bruce</author>
<price>54</price>
<year>2008</year>
</book>
<book isbn="1003" catalog="武侠">
<name lang="zh">笑傲江湖</name>
<author>金庸</author>
<price>70</price>
<year>1970</year>
</book>
<book isbn="1004" catalog="武侠">
<name lang="zh">小李飞刀</name>
<author>古龙</author>
<price>45</price>
<year>1965</year>
</book>
</booklist>
创建一个java实体类: Book.java
package sax.xml;
/**
*
* Class Name: Book.java
* Function:
*
* Modifications:
*
* @author Howard DateTime 2014-1-3 下午12:38:26
* @version 1.0
*/
public class Book {
private String isbn;
private String catalog;
private String name;
private String author;
private double price;
private int year;
public Book() {
super();
}
public Book(String isbn, String catalog, String name, String author,
double price, int year) {
super();
this.isbn = isbn;
this.catalog = catalog;
this.name = name;
this.author = author;
this.price = price;
this.year = year;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getCatalog() {
return catalog;
}
public void setCatalog(String catalog) {
this.catalog = catalog;
}
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 double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
@Override
public String toString() {
return "Book [isbn=" + isbn + ", catalog=" + catalog + ", name=" + name
+ ", author=" + author + ", price=" + price + ", year=" + year
+ "]";
}
}
解析xml,Xml
ContentHandler.java
package sax.xml;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class XMLContentHandler extends DefaultHandler {
private List<Book> books;
private Book book;
private String tag;
public List<Book> getBooks() {
return books;
}
/**
* 接收文档开始的通知,这里重写
* Function:
*
* @author Howard DateTime 2014-1-3 下午12:58:23
* @throws SAXException
*/
public void startDocument() throws SAXException {
books = new ArrayList<Book>();
System.out.println("开始解析");
}
/**
* 接收元素开始的通知,重写此方法,以便在每个元素的开始处采取特定的操作(如,分配新的树节点或将输出写入文件).
* Function:
* @author Howard DateTime 2014-1-3 下午12:58:12
* @param uri 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串.
* @param localName 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串.
* @param qName 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串.
* @param attributes 附加到元素的属性.如果没有属性,则它将是空的 Attributes对象.
* @throws SAXException
*/
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if ("book".equals(qName)) {
book = new Book();
book.setIsbn(attributes.getValue("isbn"));
book.setCatalog(attributes.getValue("catalog"));
}
tag = qName;
System.out.println("解析开始:" + qName);
}
/**
* 接收元素中字符数据的通知.重写此方法,以便对每块字符数据采取特定的措施(如将该数据添加到节点或缓冲区,或者将该数据打印到文件).
* Function:
* @author Howard DateTime 2014-1-3 下午12:58:32
* @param ch 字符
* @param start 字符数组中的开始位置
* @param length 从字符数组中使用的字符数
* @throws SAXException
*/
public void characters(char[] ch, int start, int length)
throws SAXException {
if (book != null) {
String data = new String(ch, start, length);
if ("name".equals(tag)) {
book.setName(data);
}
if ("author".equals(tag)) {
book.setAuthor(data);
}
if ("price".equals(tag)) {
book.setPrice(new Double(data));
}
if ("year".equals(tag)) {
book.setYear(new Integer(data));
}
System.out.println("解析内容: " + new String(ch, start, length));
}
}
/**
* 接收元素结束的通知.重写此方法,以便在每个元素的结束处采取特定的操作(如,结束树节点或将输出写入文件).
* Function:
* @author Howard DateTime 2014-1-3 下午12:58:38
* @param uri 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串.
* @param localName 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串.
* @param qName 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串.
* @throws SAXException
*/
public void endElement(String uri, String localName, String qName)
throws SAXException {
if ("book".equals(qName) && book != null) {
books.add(book);
book = null;
}
tag = null;
System.out.println("解析完毕");
}
/**
* 接收文档结束的通知.重写
* Function:
* @author Howard DateTime 2014-1-3 下午12:58:45
* @throws SAXException
*/
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("文档解析完毕");
}
}
测试:SAXBookMain.java
package sax.xml;
import java.io.InputStream;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class SAXBookMain {
public static void main(String[] args) throws Exception {
InputStream inStream = SAXBookMain.class.getClassLoader()
.getResourceAsStream("book.xml");
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser parser = spf.newSAXParser(); //创建解析器
XMLContentHandler handler = new XMLContentHandler();
parser.parse(inStream, handler);
inStream.close();
List<Book> books = handler.getBooks();
for (Book book : books) {
System.out.println("book===="+book);
}
}
}