【数据存储】SAX操作

DOMSAX区别

DOM解析适用于对文件进行修改和随机存取的操作,但是不适合于大型文件的操作;

SAX采用部分读取的方式,所以可以进行大型文件处理,而且只需要从文件中读取特定内容,而且SAX解析可以由用户自己建立对象模型。

 

     下面采用SAX解析方式读取之前的member.xml文件。如果要完成SAX解析,首先必须定义一个SAX解析器,以及一个xml信息的简单Java---LinkMan.java

 

public class LinkMan {
    private String name;
    private String email;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
}

 

 

 

member.xml文件中,每一个linkman节点都有nameemail两个节点,所以LinkMan.java类的主要功能是保存每组节点中的数据。

【定义SAX解析器,此类继承DefaultHandler

 

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 MySAX extends DefaultHandler {
    // 保存多条数据
    private List<LinkMan> all = null ;    
    // 定义封装对象
    private LinkMan man = null ;   
    // 保存节点的名称
    private String elementName = null ;    
    
    @Override  // 取得元素内容
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        if(this.elementName != null) {    
            // 已经取得了元素名称
            String data = new String(ch,start,length) ;
            if("name".equals(this.elementName)) {
                this.man.setName(data) ;   // 设置name属性
            } else if ("email".equals(this.elementName)) {
                this.man.setEmail(data) ;  // 设置email属性
            }
        }
    }
    @Override  // 元素结束
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if("linkman".equals(localName)) {
            this.all.add(this.man) ;
            // 准备保存下次的数据
            this.man = null ;    
        }
        // 把元素名称清空
        this.elementName = null;
    }
    @Override  // 开始文档
    public void startDocument() throws SAXException {
        // 表示开始解析文档,所以要设置集合
        this.all = new ArrayList<LinkMan>() ;    
    }
    @Override // 开始元素
    public void startElement(String uri, String localName, 
     String qName,Attributes attributes) throws SAXException {
        // 是一个linkman节点
        if("linkman".equals(localName)) {
            // 实例化LinkMan对象
            this.man = new LinkMan() ;    
        }
        // 保存元素名称
        this.elementName = localName ;    
    }
    public List<LinkMan> getAll() {
        return all; /** 表示取得全部内容节点内容 */
    }
}
View Code

 

 

 

 

 

本解析器的主要功能是将指定XML文档中的数据全部取出,并且将数据封装成LinkMan类的对象保存在List集合中,由于SAX解析采用的顺序的方式,所以每次操作都要对当前的操作节点进行判断,并且将指定的数据取出,最后所有的数据可以通过getAll()方法返回。

 

【定义Activity程序

 

 

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;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MyDOMDemo extends Activity {
    private TextView name = null;
    private TextView email = null;
    private Button but = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.main);
        this.name = (TextView) super.findViewById(R.id.name);
        this.email = (TextView) super.findViewById(R.id.email);
        this.but = (Button) super.findViewById(R.id.but);
        this.but.setOnClickListener(new OnClickListenerImpl());
    }
    private class OnClickListenerImpl implements OnClickListener {
        @Override
        public void onClick(View v) {
            // 不存在不操作
            if (!Environment.getExternalStorageState().equals(
                    Environment.MEDIA_MOUNTED)) { 
                return; // 返回到程序的被调用处
            }
            File file = new
               File(Environment.getExternalStorageDirectory()
                    + File.separator + "mldndata" + File.separator
                    + "member.xml"); // 要输出文件的路径
            if (!file.exists()) { // 文件不存在
                return;
            }
            // 1、建立SAX解析工厂
            SAXParserFactory factory =
                  SAXParserFactory.newInstance() ;
            // 2、构造解析器
            SAXParser parser = null ;
            MySAX sax = new MySAX() ;
            try {
                // 取得SAXParser对象
                parser = factory.newSAXParser() ;
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            } catch (SAXException e) {
                e.printStackTrace();
            }
            try {
                // 3、解析XML使用DefaultHandler
                parser.parse(file, sax) ;
            } catch (SAXException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            // 取得联系人信息
            List<LinkMan> all = sax.getAll() ;
            System.out.println(all.size());
            // 设置文本
            MyDOMDemo.this.name.setText(all.get(0).getName()) ;
            MyDOMDemo.this.email.setText(all.get(0).getEmail()) ;
        }
    }
}
View Code

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2013-06-09 11:46  大米稀饭  阅读(257)  评论(0编辑  收藏  举报