Android笔记(四十五) Android中的数据存储——XML(一)DOM解析器

DOM解析XML在j2ee开发中比较常见,在Dom解析的过程中,是先把dom全部文件读入到内存中,然后使用dom的api遍历所有数据,检索想要的数据,这种方式显然是一种比较消耗内存的方式,对于像手机这样的移动设备来讲,内存是非常有限的,所以对于比较大的XML文件,不推荐使用这种方式,但是Dom也有它的优点,它比较直观,在xml文档比较小的情况下也可以考虑使用dom方式。

代码演示:

MainActivity.java

package cn.lixyz.xmltest.activity;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import cn.lixyz.xmltest.R;
import cn.lixyz.xmltest.model.Student;

public class MainActivity extends Activity {

    private Button bt_readxml_dom, bt_writexml_dom;

    private List<Student> list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findView();
    }

    private void findView() {
        bt_readxml_dom = (Button) findViewById(R.id.bt_readxml_dom);
    }

    public void clickButton(View view) {
        switch (view.getId()) {
        case R.id.bt_readxml_dom:
            domReadXML();
            break;

        case R.id.bt_writexml_dom:
            domWriteXML();
            break;
        }
    }

    // dom方式生成xml
    private void domWriteXML() {
        // 生成xml文件的数据
        List<Student> dataList = createStudents();
        try {
            // 利用DocumentBuilderFactory创建一个DocumentBuilderFactory实例
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            // 利用DocumentBuilderFactory创建DocumentBuilder
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 利用DocumentBuilder创建Document文件
            Document document = builder.newDocument();
            // 创建根节点Students
            Element element = document.createElement("Students");
            // 将根节点添加到document中
            document.appendChild(element);
            // 用循环将数据添加到document中
            for (int i = 0; i < dataList.size(); i++) {
                // 获取第i个数据对象
                Student student = dataList.get(i);
                // 创建student元素
                Element studentElement = document.createElement("student");
                // 设置student元素的属性id
                studentElement.setAttribute("id", student.getId() + "");
                // 把student节点添加到document中
                element.appendChild(studentElement);
                // 添加name节点
                Element name = document.createElement("name");
                // 给name元素设置值
                name.setTextContent(student.getName());
                // 添加到student节点中
                studentElement.appendChild(name);
                // 添加name节点
                Element age = document.createElement("age");
                // 给age元素设置值
                age.setTextContent(student.getAge() + "");
                // 添加到student节点中
                studentElement.appendChild(age);
            }

            // 使用TransformerFactory创建一个TransformerFactory对象
            TransformerFactory tf = TransformerFactory.newInstance();
            Transformer transformer = tf.newTransformer();
            DOMSource source = new DOMSource(document);
            // 创建文件存放在 /data/data/cn.xxx.xxx(当前包)/files
            FileOutputStream fos = openFileOutput("Dom.xml", Context.MODE_PRIVATE);
            PrintWriter pw = new PrintWriter(fos);
            StreamResult result = new StreamResult(pw);
            transformer.transform(source, result);
            Toast.makeText(MainActivity.this, "生成成功", Toast.LENGTH_LONG).show();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();

        }
    }

    // dom方式读取xml文件
    private void domReadXML() {
        try {
            // 利用DocumentBuilderFactory创建一个DocumentBuilderFactory实例
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            // 利用DocumentBuilderFactory创建DocumentBuilder
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 加载XML文档(Document)
            FileInputStream is = this.getBaseContext().openFileInput("Dom.xml");
            // 调用完这句后XML文档解析完成,暂存在内存中
            Document document = builder.parse(is);
            // 获取文档的根结点(Element)
            Element rootElement = document.getDocumentElement();
            // 获取根结点中所有子节点的列表(NodeList)
            NodeList element = rootElement.getElementsByTagName("student");
            for (int i = 0; i < element.getLength(); i++) {
                // 使用getElementsByTagName再获取子节点列表中的需要读取的结点
                Element node = (Element) element.item(i);
                String id = node.getAttribute("id");
                String name = node.getElementsByTagName("name").item(0).getTextContent();
                int age = Integer.parseInt(node.getElementsByTagName("age").item(0).getTextContent());
                Log.d("TTTT", "id=" + id + ",name=" + name + ",age=" + age);
            }
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 模拟生成xml的数据
    private List<Student> createStudents() {
        list = new ArrayList<Student>();
        Student s1 = new Student();
        s1.setId(11);
        s1.setName("张三");
        s1.setAge(10);
        list.add(s1);
        Student s2 = new Student();
        s2.setId(22);
        s2.setName("李四");
        s2.setAge(11);
        list.add(s2);
        Student s3 = new Student();
        s3.setId(33);
        s3.setName("王五");
        s3.setAge(12);
        list.add(s3);
        Student s4 = new Student();
        s4.setId(44);
        s4.setName("赵六");
        s4.setAge(13);
        list.add(s4);
        Student s5 = new Student();
        s5.setId(55);
        s5.setName("刘七");
        s5.setAge(14);
        list.add(s5);
        return list;
    }
}

activity_main.xml

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="cn.lixyz.xmltest.activity.MainActivity" >

        <Button
            android:id="@+id/bt_writexml_dom"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="clickButton"
            android:text="DOM方式生成XML" />

        <Button
            android:id="@+id/bt_readxml_dom"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="clickButton"
            android:text="DOM方式读取XML" />
    </LinearLayout>

</ScrollView>

Student.java

package cn.lixyz.xmltest.model;

public class Student {

    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}
时间: 2024-11-12 21:35:12

Android笔记(四十五) Android中的数据存储——XML(一)DOM解析器的相关文章

Android笔记(六十五) android中的动画——属性动画(propertyanimation)

补间动画只能定义起始和结束两个帧在“透明度”.“旋转”.“倾斜”.“位移”4个方面的变化,逐帧动画也只能是播放多个图片,无法满足我们日常复杂的动画需求,所以谷歌在3.0开始,推出了属性动画(property animation) 属性动画已经不再是针对View来设计的了,也不仅限定于只能实现移动.缩放.淡入淡出这几种动画操作,同时也不再是一种视觉上的动画效果了.它实际上是一种不断的对值进行操作的机制,并将值赋值到指定对象的指定属性上,可以是任意对象的任意属性. ValueAnimator Val

Android笔记二十五.Android事件Handler消息传递机制

因为Android平台不同意Activity新启动的线程訪问该Activity里的界面控件.这样就会导致新启动的线程无法动态改变界面控件的属性值.但在实际Android应用开发中,尤其是涉及动画的游戏开发中,须要让新启动的线程周期性地改变界面控件的属性值,这就须要借助Handler的消息传递机制实现. 一.Handler类简单介绍 1.功能 Handler类主要有两个作用 (1)在新启动的线程中发送消息; (2)在主线程中获取消息.处理消息.即当须要界面发生变化的时候.在子线程中调用Handle

Android之旅十五 android中的网络操作

android中的网络操作和java里面没有什么区别,java里面的很多网络操作方法都可以搬到android中去使用,主要几个点: 1.post和get请求的区别,大家可以在网上查阅有关资料进行了解,get主要以向地址中拼接字符串参数发送到服务器,长度有限制,并且请求参数暴露在地址栏中,不怎么安全:post则主要是将请求参数转换为相应的http协议请求体发送到服务器,相比get方式,参数的长度没有限制,并且参数信息不会暴露给用户: 2.我们在java web里面通过浏览器以post方式发送数据,

【Unity 3D】学习笔记四十五:游戏实例——击垮围墙

用这个游戏实例来总结之前我们复习的所有关于物理引擎的知识.在游戏中,发送一个球形的炮弹来击垮前面的墙.给炮弹与墙都添加了刚体组件,给炮弹绑定了粒子系统,并且在炮弹的粒子动画中添加了5组不同的颜色,显示移动轨迹. using UnityEngine; using System.Collections; public class Script_06_14 : MonoBehaviour { //炮弹对象 private GameObject obj; //准心贴图 public Texture te

Android笔记(十五) Android中的基本组件——单选框和复选框

单选框和多选框通常用来在设置用户个人资料时候,选择性别.爱好等,不需要用户直接输入,直接在备选选项中选择,简单方便. 直接看代码: <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"

Android笔记(四十七) Android中的数据存储——XML(三)SAX解析

SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备. SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件.所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口.下面是一些ContentHandler接口常用的方法: startDocument():当遇到文档的开头的时候,调用这

Android笔记(六十六) android中的动画——XML文件定义属性动画

除了直接在java代码中定义动画之外,还可以使用xml文件定义动画,以便重用. 如果想要使用XML来编写动画,首先要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在这个文件夹当中.然后在XML文件中我们一共可以使用如下三种标签: <animator>  对应代码中的ValueAnimator <objectAnimator>  对应代码中的ObjectAnimator <set>  对应代码中的AnimatorSet 使用XML设置动

Android笔记二十六.Android异步任务处理(AsyncTask)

转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.引言 我们知道Android的UI线程主要负责处理用户的按键事件.用户触屏事件及屏幕绘图事件等,对于其他的操作尽量不要在UI线程中实现,因为这些操作很有可能会阻塞UI线程,比如一些耗时操作,会导致UI界面停止响应,从而降低了用户的体验.所以,为了避免UI线程失去响应的问题,Android建议将耗时操作放在新线程中完成,但新线程也可能需要动态更新UI组件:比如需要从网上获取一个网页,然后在Te

无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.demo1" /> 上面targetPackage指定的包要和应用的package相同. (2)在清单文件中ap