sax 读取对象存入JavaBean示例

时间:2021-11-28 22:15:19

dom解析方式把整个xml文档都加载入内存,当xml文件很大时就耗费了很多资源,sax解析就很好的解决了这一问题

sax一行行的解析,不会占用过多资源,但这也造成了编程上的一些困难,由于他一行行的解析使他失去了整体性,不

能体现出xml的层级关系,对xml文件的操作就造成了一定的困难,这里提供了一中解决方案:

首先我们需要一个xml文件:

<?xml version="1.0" encoding="UTF-8"?>

<书架>
  <书>
    <书名>JavaOOP</书名> 
    <作者>三</作者> 
    <售价>40.00元</售价> 
    <批发价>10</批发价>
  </书> 
  <书>
    <书名>JavaScript</书名> 
    <作者>王四</作者> 
    <售价>90</售价>
  </书>
</书架>

接着建一个JavaBean:

public class Book {
 private String name;
 private String author;
 private String price;
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getAuthor() {
  return author;
 }
 public void setAuthor(String author) {
  this.author = author;
 }
 public String getPrice() {
  return price;
 }
 public void setPrice(String price) {
  this.price = price;
 }
 @Override
 public String toString() {
  return "Book [author=" + author + ", name=" + name + ", price=" + price
    + "]";
 }
 
}

下面实现sax编程解析

public class SaxDemo3 {
 public static void main(String[] args) throws Exception {
  SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
  XMLReader reader = parser.getXMLReader();
  MyContentHanlder3 mch = new MyContentHanlder3();
  reader.setContentHandler(mch);
  reader.parse("src/book.xml");
  List<Book> books = mch.getBooks();
  for(Book b:books){
   System.out.println(b);
  }
 }

}
class MyContentHanlder3 extends DefaultHandler{
 private List<Book> books = new ArrayList<Book>();
 String currentTagName = "";//记录当前读到的元素名称
 Book book = null;
 @Override
 public void startElement(String uri, String localName, String qName,
   Attributes attributes) throws SAXException {
  currentTagName = qName;//书架  书 书名  “” 作者 “”
  if("书".equals(qName)){
   book = new Book();
  }
 }
 @Override
 public void characters(char[] ch, int start, int length)
   throws SAXException {
  if("书名".equals(currentTagName)){
   book.setName(new String(ch,start,length));
  }
  if("作者".equals(currentTagName)){
   book.setAuthor(new String(ch,start,length));
  }
  if("售价".equals(currentTagName)){
   book.setPrice(new String(ch,start,length));
  }
 }

 @Override
 public void endElement(String uri, String localName, String qName)
   throws SAXException {
  if("书".equals(qName)){
   books.add(book);
  }
  currentTagName="";
 }
 public List<Book> getBooks() {
  return books;
 }
 
}