sax解析xml文件

时间:2022-11-16 16:01:09

一  xml文件内容 


<?xml version="1.0" encoding="UTF-8"?>
<books>
 <book id="12">
  <name>book1</name>
  <price>85.5</price>
 </book>
 <book id="15">
  <name>book2</name>
  <price>39.0</price>
 </book>
</books>

二  类Book的定义

public class Book {
 private int id;
 private String name;
 private float price;
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public float getPrice() {
  return price;
 }
 public void setPrice(float price) {
  this.price = price;
 }
 @Override
 public String toString(){
  return this.id+":"+this.name+":"+this.price;
 }
}

三 解析服务编写


import java.io.InputStream;
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;

 

public class SaxParseService extends DefaultHandler{
 private List<Book> books = null;
 private Book book = null;
 private String preTag = null;//作用是记录解析时的上一个节点名称
 
 public List<Book> getBooks(InputStream xmlStream) throws Exception{
  SAXParserFactory factory = SAXParserFactory.newInstance();
  SAXParser parser = factory.newSAXParser();
  SaxParseService handler = new SaxParseService();
  parser.parse(xmlStream, handler);
  return handler.getBooks();
 }
 
 public List<Book> getBooks(){
  return books;
 }
 
 @Override
 public void startDocument() throws SAXException {
  books = new ArrayList<Book>();
 }

 @Override
 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
  if("book".equals(qName)){
   book = new Book();
   book.setId(Integer.parseInt(attributes.getValue(0)));
  }
  preTag = qName;//将正在解析的节点名称赋给preTag
 }

 @Override
 public void endElement(String uri, String localName, String qName)
   throws SAXException {
  if("book".equals(qName)){
   books.add(book);
   book = null;
  }
  preTag = null;

/**当解析结束时置为空。这里很重要,例如,当图中画3的位置结束后,会调用这个方法
  ,如果这里不把preTag置为null,根据startElement(....)方法,preTag的值还是book,当文档顺序读到图
  中标记4的位置时,会执行characters(char[] ch, int start, int length)这个方法,而characters(....)方
  法判断preTag!=null,会执行if判断的代码,这样就会把空值赋值给book,这不是我们想要的。*/
 }
 
 @Override
 public void characters(char[] ch, int start, int length) throws SAXException {
  if(preTag!=null){
   String content = new String(ch,start,length);
   if("name".equals(preTag)){
    book.setName(content);
   }else if("price".equals(preTag)){
    book.setPrice(Float.parseFloat(content));
   }
  }
 }
 
}

四  解析xml

import java.io.InputStream;
import java.util.List;

import junit.framework.TestCase;
public class ParseTest extends TestCase{
 public void testSAX() throws Throwable{
  SaxParseService sax = new SaxParseService();
  InputStream input = this.getClass().getClassLoader().getResourceAsStream("com/xml/book.xml");

  List<Book> books = sax.getBooks(input);
  for(Book book : books){
   System.out.println(book.toString());
  }
 }
}