【数据存储】SAX操作
DOM和SAX区别
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节点都有name和email两个节点,所以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; /** 表示取得全部内容节点内容 */ } }
本解析器的主要功能是将指定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()) ; } } }