zoukankan      html  css  js  c++  java
  • 【数据存储】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

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    leetcode-000-序
    统计学习方法:支撑向量机(SVM)
    统计学习方法:CART算法
    统计学习方法:最大熵模型
    〖Linux〗关于Linux软件包安装位置、版本查询
    〖Linux〗ltib的使用帮助
    〖Linux〗Debian 7.1.0 Wheezy使用ltib报错的解决办法
    〖Android〗把CM(Android)源代码导入eclipse的正确方法(2013-7-3)
    【Linux】eclipse juno 边框过大的调整方法
    【Android】在build/envsetup.sh中添加自己的命令(函数)
  • 原文地址:https://www.cnblogs.com/androidsj/p/3128607.html
Copyright © 2011-2022 走看看