您的位置:首页 > 其它

sax解析xml文件

2013-08-29 11:35 260 查看
一  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());

  }

 }

}

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml