SAX解析XML文件

来源:互联网 发布:阿菲金软件配置 编辑:程序博客网 时间:2024/06/07 07:17

SAX(Simple API for XML),是指一种接口,或者一个软件包。

SAX:事件驱动型的XML解析方式。顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问,且是只读的。

由于移动设备的内存资源有限,SAX的顺序读取方式更适合移动开发。


SAX解析xml文件,将解析出来的结果放到一个bean中,再将所有的baen放到list列表中

例子程序的xml文件为:

[css] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <书架>  
  3.    <书>  
  4.         <书名>海的女儿</书名>  
  5.         <作者>安徒生</作者>  
  6.         <售价>50.0元</售价>  
  7.    </书>  
  8.    <书>  
  9.         <书名>卖火柴的小女孩</书名>  
  10.         <作者>安徒生</作者>  
  11.         <售价>28.0元</售价>  
  12.    </书>  
  13. </书架>  


需要一个book类,存放书的具体信息(书名,作者,售价)为:

[java] view plain copy
  1. package com.flower.parsexml;  
  2.   
  3.   
  4. public class Book {  
  5.     private String name;  
  6.     private String author;  
  7.     private String price;  
  8.     public String getName() {  
  9.         return name;  
  10.     }  
  11.     public void setName(String name) {  
  12.         this.name = name;  
  13.     }  
  14.     public String getAuthor() {  
  15.         return author;  
  16.     }  
  17.     public void setAuthor(String author) {  
  18.         this.author = author;  
  19.     }  
  20.     public String getPrice() {  
  21.         return price;  
  22.     }  
  23.     public void setPrice(String price) {  
  24.         this.price = price;  
  25.     }  
  26.       
  27.   
  28. }  


下面开始解析,代码如下:

[java] view plain copy
  1. package com.flower.parsexml;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.ArrayList;  
  5.   
  6. import javax.xml.parsers.ParserConfigurationException;  
  7. import javax.xml.parsers.SAXParser;  
  8. import javax.xml.parsers.SAXParserFactory;  
  9.   
  10. import org.xml.sax.Attributes;  
  11. import org.xml.sax.SAXException;  
  12. import org.xml.sax.XMLReader;  
  13. import org.xml.sax.helpers.DefaultHandler;  
  14.   
  15. public class SAXparse {  
  16.     @SuppressWarnings("unchecked")  
  17.     public static void main(String[] args) throws ParserConfigurationException,  
  18.             SAXException, IOException {  
  19.         // 创建解析工厂  
  20.         SAXParserFactory factory = SAXParserFactory.newInstance();  
  21.         // 创建解析器  
  22.         SAXParser parser = factory.newSAXParser();  
  23.         // 得到读取器  
  24.         XMLReader reader = parser.getXMLReader();  
  25.         // 设置内容处理器  
  26.         BeanListHandler handler = new BeanListHandler();  
  27.         reader.setContentHandler(handler);  
  28.         // 读取xml文档  
  29.         reader.parse("src/books.xml");  
  30.         ArrayList list = handler.getBooks();  
  31.         Book book;  
  32.         for(int i = 0; i < list.size(); i++) {  
  33.             book = new Book();  
  34.             book = (Book) list.get(i);  
  35.             System.out.println(book.getName() + book.getAuthor() + book.getPrice());  
  36.         }  
  37.   
  38.     }  
  39.   
  40. }  
  41.   
  42. class BeanListHandler extends DefaultHandler {  
  43.     //将读取的内容存放到一个book对象中,存放到list集合中  
  44.       
  45.     ArrayList<Book> list = new ArrayList<Book>();  
  46.     private String currentTag;  
  47.     private Book book;  
  48.       
  49.     @Override  
  50.     public void startElement(String uri, String localName, String qName,  
  51.             Attributes attributes) throws SAXException {  
  52.         currentTag = qName;  
  53.         if("书".equals(currentTag)) {  
  54.             book = new Book();  
  55.         }  
  56.     }  
  57.   
  58.     @Override  
  59.     public void characters(char[] ch, int start, int length)  
  60.             throws SAXException {  
  61.         if("书名".equals(currentTag)) {  
  62.             String name = new String(ch,start,length);  
  63.             book.setName(name);  
  64.         }  
  65.         if("作者".equals(currentTag)) {  
  66.             String author = new String(ch,start,length);  
  67.             book.setAuthor(author);  
  68.         }  
  69.         if("售价".equals(currentTag)) {  
  70.             String price = new String(ch,start,length);  
  71.             book.setPrice(price);  
  72.         }  
  73.     }  
  74.   
  75.     @Override  
  76.     public void endElement(String uri, String localName, String qName)  
  77.             throws SAXException {  
  78.         if("书".equals(qName)) {  
  79.             list.add(book);  
  80.             book = null;  
  81.         }  
  82.         currentTag = null;  
  83.     }  
  84.   
  85.       
  86.     public ArrayList<Book> getBooks() {  
  87.         return list;  
  88.     }  
  89.   
  90.   
  91. }  


 

运行结果为:

[java] view plain copy
  1. 海的女儿安徒生50.0元  
  2. 卖火柴的小女孩安徒生28.0元  
0 0
原创粉丝点击