xml解析之sax解析

上節大概舉例實現了dom解析,這節來看看sax解析

 SAX,全稱Simple API for XML,是一種以事件驅動的XMl API,是XML解析的一種新的替代方法,解析XML常用的還有DOM解析,PULL解析(Android特有),SAX與DOM不同的是它邊掃描邊解析,自頂向下依次解析,由於邊掃描邊解析,所以它解析XML具有速度快,佔用內存少的優點,對於Android等CPU資源寶貴的移動平臺來說是一個巨大的優勢。

SAX的優點:
    1.解析速度快
    2.佔用內存少

SAX的缺點:
    1.無法知道當前解析標籤(節點)的上層標籤,及其嵌套結構,僅僅知道當前解析的標籤的名字和屬性,要知道其他信息需要程序猿自己編碼
    2.只能讀取XML,無法修改XML
    3.無法隨機訪問某個標籤(節點)
SAX解析適用場合
    4.對於CPU資源寶貴的設備,如Android等移動設備
    5.對於只需從xml讀取信息而無需修改xml

下面是簡單的代碼實現:

package xml;

import java.io.IOException;
import java.util.ArrayList;

import javax.xml.parsers.ParserConfigurationException;
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 SaxParser {

    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {

        //1.創建解析工廠
        SAXParserFactory factory=SAXParserFactory.newInstance();
        //2.創建解析器
        SAXParser parser=factory.newSAXParser();
        //3.解析文檔,傳入xml文件和自己設計的處理器
        parser.parse("resource/Demo1.xml", new Myhandler());
        for (int i = 0; i < Myhandler.alist.size(); i++) {
            System.out.println(Myhandler.alist.get(i));
        }

    }

}
class Myhandler extends DefaultHandler{

    /**
     * 創建集合,存儲數據,這裏我們要解析的是xml文件裏面書的相關信息,所以要另外建一個類Book
     * 提供get和set方法
     * 在Myhandler這個類中有許多可以重寫的方法,這裏簡單列出三個主要的
     * 其他的可以等有機會我再總結,有興趣可以自己看看
     * 
     */

    static ArrayList<Book> alist=new ArrayList<Book>();
    Book book;
    String qname;
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {

        this.qname=qName;
        if("book".equals(qName)){
            book=new Book();
        }


    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
    if("title".equals(qname)){
        book.setTitle(new String(ch,start,length));
    }else if("author".equals(qname)){
        book.setAuthor(new String(ch,start,length));
    }else if("year".equals(qname)){
        book.setYear(new String(ch,start,length));
    }else if("price".equals(qname)){
        book.setPrice(new String(ch,start,length));
    }else if("category".equals(qname)){
        book.setCategory(new String(ch,start,length));
    }

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

    /*@Override
    public void startDocument() throws SAXException {

        System.out.println("文檔解析開始啦");
    }
    //這兩個方法的結果和我預想的不太一樣,先註釋掉。。。
    @Override
    public void endDocument() throws SAXException {

        System.out.println("文檔解析結束");
    }*/
}

//======這是新建的book類,輔助測試
package xml;

public class Book {

    String title;
    String author;
    String year;
    String price;
    String category;

    public Book(){

    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    public String getYear() {
        return year;
    }
    public void setYear(String year) {
        this.year = year;
    }
    public String getPrice() {
        return price;
    }
    public void setPrice(String price) {
        this.price = price;
    }
    public String getCategory() {
        return category;
    }
    public void setCategory(String category) {
        this.category = category;
    }
    public Book(String title, String author, String year, String price,
            String category) {
        super();
        this.title = title;
        this.author = author;
        this.year = year;
        this.price = price;
        this.category = category;
    }
    @Override
    public String toString() {
        return "Book [title=" + title + ", author=" + author + ", year=" + year
                + ", price=" + price + ", category=" + category + "]";
    }

}

前面總結部分轉載自這篇博客,寫的很好!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章