xml文件
<bookstore> <book category="COOKING"> 0 <title lang="en">Everyday Italian</title> 1 <author>Giada De Laurentiis</author> 2 <year>2005</year> 3 <price>30.00</price> 4 </book> <book category="CHILDREN"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="WEB"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> </bookstore>
java文件
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
public class Main {
public static void main(String[] args) throws SAXException,
ParserConfigurationException, FileNotFoundException, IOException {
// 工厂
SAXParserFactory parserFactory = SAXParserFactory.newInstance();
// reader
XMLReader xmlReader = parserFactory.newSAXParser().getXMLReader();
// XML Handler
BookHandler handler = new BookHandler();
// reader绑定handle
xmlReader.setContentHandler(handler);
// reader开始转换
xmlReader.parse(new InputSource(new FileInputStream(
"D:\\workspace\\SAXTest\\src\\1.xml")));
// handler返回处理结果
List<Book> list = handler.getList();
for (Book book : list) {
System.out.println("******************************");
System.out.println("Book --");
System.out.println("category: " + book.getCategory());
System.out.println("title: " + book.getTitle());
System.out.println("author: " + book.getAuthor());
System.out.println("year: " + book.getYear());
System.out.println("price: " + book.getPrice());
System.out.println("******************************");
}
}
}
// XML Handler
class BookHandler extends DefaultHandler {
// 所有Book
private List<Book> list = null;
// 存储<Tag -> index>映射
private Map<String, Integer> map = new HashMap<String, Integer>();
// 当前处理的Tag对应的index
private int curTag = -1;
// 当前处理的Book
private Book book = null;
public BookHandler() {
map.put("bookstore", 0);
map.put("book", 1);
map.put("title", 2);
map.put("author", 3);
map.put("year", 4);
map.put("price", 5);
}
public List<Book> getList() {
return list;
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
curTag = map.get(qName);
switch (curTag) {
case 0: {// 处理bookstore
list = new ArrayList<Book>();
break;
}
case 1: {// 处理book
book = new Book();
// 处理category
book.setCategory(attributes.getValue("category"));
break;
}
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
switch (curTag) {
case 2: {// 处理title
book.setTitle(new String(ch, start, length));
break;
}
case 3: {// 处理author
book.setAuthor(new String(ch, start, length));
break;
}
case 4: {// 处理year
book.setYear(new String(ch, start, length));
break;
}
case 5: {// 处理price
book.setPrice(new String(ch, start, length));
break;
}
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
if (1 == map.get(qName)) {// book
list.add(book);
} else {
curTag = -1;
}
}
}
// JavaBean: Book
class Book {
private String category;
private String title;
private String author;
private String year;
private String price;
public void setCategory(String category) {
this.category = category;
}
public void setTitle(String title) {
this.title = title;
}
public void setAuthor(String author) {
this.author = author;
}
public void setYear(String year) {
this.year = year;
}
public void setPrice(String price) {
this.price = price;
}
public String getCategory() {
return category;
}
public String getTitle() {
return title;
}
public String getAuthor() {
return author;
}
public String getYear() {
return year;
}
public String getPrice() {
return price;
}
}