安卓解析XML之SAX

***MySaxHandler***

package android_xml_sax;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class MySaxHandler extends DefaultHandler {
    public List<Book> list ;
    public Book book ;
    public StringBuilder builder;
    
    
    public List<Book> getList() {
        return list;
    }
    
    
    @Override
    public void startDocument() throws SAXException {
        // TODO 自动生成的方法存根
        super.startDocument();
        list = new ArrayList<Book>();
        builder = new StringBuilder();
    }

    /**
     *方法说明:
     *解析器在 XML 文档中的每个元素的开始调用此方法;对于每个 startElement 事件都将有相应的 endElement 事件(即使该元素为空时)。所有元素的内容都将在相应的 endElement 事件之前顺序地报告。
     *参数说明:
     *uri - 名称空间 URI,如果元素没有名称空间 URI,或者未执行名称空间处理,则为空字符串
     *localName - 本地名称(不带前缀),如果未执行名称空间处理,则为空字符串
     *qName - 限定名(带有前缀),如果限定名不可用,则为空字符串
     *atts - 连接到元素上的属性。如果没有属性,则它将是空 Attributes 对象。在 startElement 返回后,此对象的值是未定义的
     */
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // TODO 自动生成的方法存根
        super.startElement(uri, localName, qName, attributes);
        if(qName.equals("book")){
            book = new Book();
        }
        builder.setLength(0);
    }
    
    /**
     * 接收字符数据的通知,可以通过new String(ch,start,length)构造器,创建解析出来的字符串文本.
     *参数:
     *ch - 来自 XML 文档的字符
     *start - 数组中的开始位置
     *length - 从数组中读取的字符的个数 
     */

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        // TODO 自动生成的方法存根
        super.characters(ch, start, length);
        builder.append(ch, start, length);  //将读取的字符数组追加到builder中     
        
    }
    /**
     * SAX 解析器会在 XML 文档中每个元素的末尾调用此方法;对于每个 endElement 事件都将有相应的 startElement 事件(即使该元素为空时)。
     * 参数:
     *uri - 名称空间 URI,如果元素没有名称空间 URI,或者未执行名称空间处理,则为空字符串
     *localName - 本地名称(不带前缀),如果未执行名称空间处理,则为空字符串
     *qName - 限定的 XML 名称(带前缀),如果限定名不可用,则为空字符串
     */
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // TODO 自动生成的方法存根
        super.endElement(uri, localName, qName);
        if(qName.equals("id")){
            book.setId(Integer.parseInt(builder.toString()));
        }else if(qName.equals("name")){
            book.setName(builder.toString());
        }else if(qName.equals("price")){
            book.setPrice(Float.parseFloat(builder.toString()));
        }else if(qName.equals("book")){
            list.add(book);
        }
    }

    @Override
    public void endDocument() throws SAXException {
        // TODO 自动生成的方法存根
        super.endDocument();
        
    }

    

    

}

***test.java***

package android_xml_sax;

import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

public class test {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        
        SAXParserFactory factory = SAXParserFactory.newInstance();
        try {
            SAXParser parser = factory.newSAXParser();
            MySaxHandler handler = new MySaxHandler();
            parser.parse(new File("src/xml/book.xml"), handler);
            List<Book> list = handler.getList();
            for(Book book:list){
                System.out.println(book.toString());
            }
        } catch (ParserConfigurationException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
        
    }

}

***Book.java***

package android_xml_sax;

public class Book {
    private int id;
    private String name;
    private float price;
    
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "id:" + id + ", name:" + name + ", price:" + price;
    }
}

***book.xml***

<?xml version="1.0" encoding="utf-8"?>
<books>
    <book>
        <id>1</id>
        <name>Thinking In Java</name>
        <price>80.00</price>
    </book>
    <book>
        <id>2</id>
        <name>Core Java</name>
        <price>90.00</price>
    </book>
    <book>
        <id>3</id>
        <name>Hello, Andriod</name>
        <price>100.00</price>
    </book>
</books>

 

posted @ 2015-06-15 11:29  BBGL_Z  阅读(209)  评论(0编辑  收藏  举报