Android_Sax引擎读取xml文件

来源:互联网 发布:合肥百度seo教程 编辑:程序博客网 时间:2024/05/22 14:48

本文内容来自<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;}@Overridepublic void startDocument() throws SAXException{// TODO Auto-generated method stubsuper.startDocument();products = new ArrayList<Product>();}@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException{// TODO Auto-generated method stubsuper.startElement(uri, localName, qName, attributes);if(localName.endsWith("product")){//如果开始分析的是<product>标签,创建一个Product对象product = new Product();}}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException{// TODO Auto-generated method stubsuper.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);}}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException{buffer.append(ch,start,length);// TODO Auto-generated method stubsuper.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

原创粉丝点击