读取的XML文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="1">
<name>Thinking in java</name>
<price>89</price>
</book>
<book id="3">
<name>Spring in Action</name>
<price>46</price>
</book>
<book id="9">
<name>Java Web development start</name>
<price>12</price>
</book>
</books>
public class SAXTest {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
getBooks();
}
public static void getBooks() throws Exception
{
List<Book> books = new ArrayList<Book>();//保存book
SAXParserFactory saxFactory = SAXParserFactory.newInstance();//sax转换工厂类
SAXParser parser = saxFactory.newSAXParser();//创建一个新的转换器
//文件输入流
FileInputStream fi = new FileInputStream(SAXTest.class.getClassLoader().getResource("Test.xml").getPath());
SAXHandler handler = new SAXHandler(books);//xml处理类
parser.parse(fi, handler);//读取xml
books = handler.getBooks();//获取books
for(Book book : books)//输出
{
System.out.println("ID: " + book.getId() + " Name: "+ book.getName() + " Price: " + book.getPrice());
}
}
}
//xml文件读取的处理类
public class SAXHandler extends DefaultHandler {
//存放书籍
private List<Book> books ;
private String preElement = null;//存放之前一个Element
private Book book = null;//存放一本书
public SAXHandler(List<Book> books)
{
this.books = books;
}
public SAXHandler(){
}
public List<Book> getBooks()
{
return books;//返回list
}
@Override
public void startDocument() throws SAXException {
//标识文档的开始
System.out.println("the document start");
//创建一个list来
books = new ArrayList<Book>();
super.startDocument();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//当一个元素开始时,调用此方法
System.out.println("start element " + qName);
if("book".equals(qName))
{
book = new Book();//创建一本书
book.setId(Integer.parseInt(attributes.getValue(0)));
}
preElement = qName;//获取当前元素
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
//一个元素结束时调用此方法
System.out.println("end element " + qName);
if("book".equals(qName))//判断当前结束的元素是不是book
{
books.add(book);//加入list中
book = null;//清空
System.out.println();//换一行
}
preElement = null;//将前一个元素清空
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
//当为文本节点时调用此方法
//判断上个节点是不是name
if("name".equals(preElement)){
if(book == null)
{
book = new Book();
}
book.setName(new String(ch,start,length));
}
//判断上个节点是否price
if("price".equals(preElement)){
if(book == null)
{
book = new Book();
}
book.setPrice(Float.parseFloat(new String(ch,start,length)));
}
}
@Override
public void endDocument() throws SAXException {
//文档结束时调用
System.out.println("end document !");
}
}