xml解析之sax解析

来源:互联网 发布:手机淘宝网页版 编辑:程序博客网 时间:2024/06/04 17:53

上节大概举例实现了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 + "]";    }}

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