package com.sax;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import com.obj.Book;
public class SAXDemo {
public static void main(String[] args) throws Exception{
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
BookHandler bh = new BookHandler();
parser.parse(SAXDemo.class.getResourceAsStream("/xml/books.xml"), bh);
for(Book b : bh.list){
System.out.println(b);
}
}
static class BookHandler extends DefaultHandler{
private List<Book> list = new ArrayList<Book>();
Book book = null;
String xpath = "";
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String s = new String(ch, start, length);
if("/books/book/name".equals(xpath)){
book.setName(s);
}else if("/books/book/isbn".equals(xpath)){
book.setIsbn(s);
}else if("/books/book/authors/name".equals(xpath)){
book.getAuthors().add(s);
}else if("/books/book/publisher".equals(xpath)){
book.setPublisher(s);
}else if("/books/book/pub-time".equals(xpath)){
try {
book.setPubtime(s);
} catch (Exception e) {
throw new RuntimeException(e);
}
}else if("/books/book/price".equals(xpath)){
book.setPrice(Double.parseDouble(s));
}else if("/books/book/pages".equals(xpath)){
book.setPages(Integer.parseInt(s));
}
}
/**
* localname:没有前缀的标签名,如果没有命名空间,该字符串为空
* qname:带前缀的标签名
*/
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
xpath += "/" + qName;
if("/books/book".equals(xpath)){
book = new Book();
list.add(book);
}
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
xpath = xpath.substring(0, xpath.lastIndexOf("/"));
}
}
}
解析的XML文件:
<?xml version="1.0" encoding="UTF-8" ?>
<books>
<book>
<name>XML 从入门到精通</name>
<isbn>IRUGN8937F6W9K3</isbn>
<authors>
<name>张三</name>
<name>李四</name>
</authors>
<publisher>达内出版社</publisher>
<pub-time>2011-9-29</pub-time>
<price>500</price>
<pages>93</pages>
</book>
<book>
<name>XML 从入门到精通</name>
<isbn>IRUGN8937F6W9K3</isbn>
<authors>
<name>张三</name>
<name>小李</name>
</authors>
<publisher>达内出版社</publisher>
<pub-time>2011-9-29</pub-time>
<price>500</price>
<pages>93</pages>
</book>
</books>