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 + "]";
    }

}

前面总结部分转载自这篇博客,写的很好!!!

猜你喜欢

转载自blog.csdn.net/wlyang666/article/details/78774695