SAX解析:基于事件回调机制,从上至下顺序执行
XML文件:
<?xml version="1.0" encoding="UTF-8"?> <book-list> <book id = "a"> <name>Java葵花宝典</name> <author>SUN</author> <price>50</price> </book> <book id = "c"> <name>凤凰周刊</name> <author>凤凰</author> <price>30</price> </book> </book-list>
package sax;
public class Book {
private String id;
private String name;
private String author;
private double price;
public Book() {
}
public Book(String id, String name, String author, double price) {
super();
this.id = id;
this.name = name;
this.author = author;
this.price = price;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
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;
}
}
package sax;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
/**
* book 处理程序
* @author zjw
*
*/
public class BookContentHandler extends DefaultHandler {
private List<Book> list;
private Book book;
private String flag;
//接收文档开始的通知
public void startDocument(){
list = new ArrayList<Book>();
}
public List<Book> getList() {
return list;
}
//接收元素开始的通知
public void startElement(String uri, String localName, String qName, Attributes attr){
if("book".equals(qName)){
book = new Book();
book.setId(attr.getValue("id"));
}else{
flag = qName;
}
}
//接收字符数据的通知
public void characters(char [] ch, int start, int length){
String data = new String(ch, start, length);
if("name".equals(flag)){
//System.out.println(data);
book.setName(data);
}else if("author".equals(flag)){
//System.out.println(data);
book.setAuthor(data);
}else if("price".equals(flag)){
book.setPrice(Double.parseDouble(data));
}
}
//结束元素结束的通知
public void endElement(String uri, String localName, String qName){
if("book".equals(qName)){
list.add(book);
book = null;
}
flag = null;
}
//接收文档结束的通知
public void endDocument(){
}
}
package sax;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
public class BookSAXParser {
public static void main(String[] args) {
//创建SAX解析器的工厂类
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
//获取SAX解析器
SAXParser parser = factory.newSAXParser();
//获取使用回调读取XML文档对象
//XMLReader reader = parser.getXMLReader();
//将编写的文档处理程序注册到SAX解释器对象上
BookContentHandler ch = new BookContentHandler();
//注册文档处理程序
//reader.setContentHandler(ch);
//获取XML文件路径
String path = BookSAXParser.class.getClassLoader().getResource("books.xml").getPath();
//根据路径解析XML文件
//reader.parse(path);
parser.parse(new File(path), ch);
List<Book> list = ch.getList();
Iterator<Book> iter = list.iterator();
while(iter.hasNext()){
Book b = iter.next();
System.out.println(b.getId() + "\t" + b.getName() + "\t"
+ b.getAuthor() + "\t" + b.getPrice());
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
输出结果:
a Java葵花宝典 SUN 50.0
c 凤凰周刊 凤凰 30.0