安卓解析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>
时间: 2024-07-31 12:07:58

安卓解析XML之SAX的相关文章

JAVA解析XML之SAX方式

JAVA解析XML之SAX方式 SAX解析xml步骤 通过SAXParseFactory的静态newInstance()方法获取SAXParserFactory实例factory 通过SAXParserFactory实例的newSAXParser()方法返回SAXParser实例parser 创建一个类继承DefaultHandle,重写方法进行业务处理并创建这个类的实例handle 重写DefaultHandle类的方法 startElement方法用来遍历xml文件的开始标签; endEle

XML引入,DOM 方式解析XML 原理,SAX 方式解析XML

XML 简介 Xml(eXtensible Markup Language) 即可扩展标记语言.提供了一套跨平台.跨网络.跨程序的语言的数据描述方式,使用XML 可以方便地实现数据交换.系统配置.内容管理等常见功能. 元素VS 节点 节点包括元素节点.属性节点.文本节点:元素一定是节点,但是节点不一定是元素: <?xml version="1.0" encoding="UTF-8"?> <emp> <empName empNo=&quo

Android解析XML之SAX解析器

SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的.当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理.在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为. SAX解析器的优点是解析速度快,占用内存少.非常适合在Android移动设备中使用. SAX相关类及API DefaultHandler:是一个事

android解析XML总结-SAX、Pull、Dom三种方式

在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX.Pull.Dom解析方式.最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一次总结. xml示例(channels.xml)如下: <?xml version="1.0" encoding="utf-8"?> <channel> <item id="0&q

解析xml:dom,sax,jdom,dom4j,推荐dom4j

1):dom解析,放在内存中占用内存比较大 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { DocumentBuilder db = dbf.newDocumentBuilder(); Document d = db.parse("src/student.xml"); NodeList nl = d.getElementsByTagName("student"); El

iOS中的数据解析(XML,JSON),SAX解析,DOM解析

第三方 SAT解析 #import "SAXTableViewController.h" #import "Student.h" @interface SAXTableViewController ()<NSXMLParserDelegate> @property (nonatomic, retain) NSMutableArray *dataSourse; // 存储学生对象 @property (nonatomic, retain) Student

安卓解析xml格式字符串

最近实验室的安卓app需要实现发内部邮件的功能. 说白了就是简单的数据库的增删处理. 但是中间的一部分有意思的就是获取收件人的列表的处理. 用户在登录APP的时候,如果验证成功,服务器则把数据的联系人的所有信息发送回来到客户端. 发送出来的格式是dataset,处理之后转换为xml格式的字符串发出来. 当发邮件的时候 ,则会在收件人提供一个Spinner控件,然后把所有人的名字显示出来. 这个时候就涉及到xml格式的字符串的解析. 我的实现方法很简单.用的是PULL方法.希望能够帮助到需要的同学

Android DOM、SAX、Pull解析XML(转)

本篇随笔将详细讲解如何在Android当中解析服务器端传过来的XML数据,这里将会介绍解析xml数据格式的三种方式,分别是DOM.SAX以及PULL. 一.DOM解析XML 我们首先来看看DOM(Document Object Model)这种方式解析xml,通过DOM解析xml在j2ee开发中非常的常见,它将整个xml看成是一个树状的结构,在解析的时候,会将整个xml文件加载到我们的内存当中,然后通过DOM提供的API来对我们的xml数据进行解析,这种方式解析xml非常的方便,并且我们可以通过

iOS开发2-使用SAX解析XML数据

XML数据结构和解析 1.1XML数据结构 XML 是可扩展标记语言(Extensible Markup Language)的缩写,其中的 标记(markup)是关键部分.可以创建内容,然后使用限定标记标记它,从而使每个单词.短语或块成为可识别.可分类的信息.创建的文件,或文档实例 由元素(标记)和内容构成.当从打印输出读取或以电子形式处理文档时,元素能够帮助更好地理解文档.元素的描述性越强,文档各部分越容易识别.自从出现标记至今,带有标记的内容就有一个优势,即在计算机系统缺失时,仍然可以通过标