Android_Sax引擎读取xml文件

本文内容来自<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
		}
		
	}
效果图如下:


源码下载:

http://download.csdn.net/download/zlfxy/5098147

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值