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