安卓解析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>

 

你可能感兴趣的:(解析xml)