本文内容来自<android开发权威指南>。
SAX技术在处理XML文件时,并不是一次性把XML文件装入内存,而是一边读,一边解析。因此,这就需要处理如下5个分析点。
1、开始分析xml文件。该分析点表示sax引擎刚开始处理xml文件,还没读取xml文件中的内容。对应于DefaultHandler.startDocument方法。
2、开始处理每个xml标签。也就是遇到<product>、<item>这样的起始标记。对应startElement放法。
3、处理完一个xml标签,即</product>这样的结束标记。对应于endElement方法。
4、处理完xml文件。如果sax引擎将整个xml文件的内容都扫描完了,就到了这个分析点。该分析点对应endDocument方法。该事件不是必须的,如果最后有一些收尾的工作,如释放资源,可以再改方法中完成。
5、读取字符分析点。只是最重要的分析点,如果没有这个分析点,前4步的处理相当于白跑一遍,虽然读取了xml文件中的所有内容,但并未处理这些内容,而这个分析点对应的characters事件方法的主要作用就是处理sax引擎读取的xml文件中的内容,更准确的说是保存xml标签的内容,如<product>abc</product>中的abc.
核心代码为:
package com.zlf.sax;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class XmlProduct extends DefaultHandler
{
private List<Product> products;
private Product product;
private StringBuffer buffer = new StringBuffer();
public List<Product> getProducts()
{
return products;
}
@Override
public void startDocument() throws SAXException
{
// TODO Auto-generated method stub
super.startDocument();
products = new ArrayList<Product>();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException
{
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
if(localName.endsWith("product"))
{
//如果开始分析的是<product>标签,创建一个Product对象
product = new Product();
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException
{
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
if (localName.equals("product"))
{
products.add(product);
}else if (localName.equals("id"))
{
//设置id的值
product.setId(Integer.parseInt(buffer.toString().trim()));
//将保存标签内容的缓冲区清空
buffer.setLength(0);
}else if (localName.equals("name")) {
//设置name的值
product.setName(buffer.toString().trim());
buffer.setLength(0);
}else if (localName.equals("price")) {
//设置price的值
product.setPrice(buffer.toString().trim());
buffer.setLength(0);
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException
{
buffer.append(ch,start,length);
// TODO Auto-generated method stub
super.characters(ch, start, length);
}
}
在主类中的方法为:
public void button_Sax(View view)
{
try
{
//获得res/raw/product.xml文件中的InputStream对象
//相当于获取解析对象
InputStream is = getResources().openRawResource(R.raw.products);
XmlProduct xmlProduct = new XmlProduct();
//开始解析products.xml文件
Xml.parse(is, Xml.Encoding.UTF_8,xmlProduct);
//下面的代码用于输出转换后的java对象的内容
List<Product> products = xmlProduct.getProducts();
String msg ="共" + products.size()+"产品\n";
for(Product product :products)
{
msg +="id"+product.getId()+" 产品名:"+product.getName()+" 价格"+product.getPrice()+"\n";
}
new AlertDialog.Builder(this).setTitle("产品信息").setMessage(msg).setPositiveButton("关闭", null).show();
} catch (Exception e)
{
// TODO: handle exception
}
}
效果图如下:
源码下载: