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;
} }
Android笔记(四十五) Android中的数据存储——XML(一)DOM解析器的更多相关文章
- Android笔记(六十五) android中的动画——属性动画(propertyanimation)
补间动画只能定义起始和结束两个帧在“透明度”.“旋转”.“倾斜”.“位移”4个方面的变化,逐帧动画也只能是播放多个图片,无法满足我们日常复杂的动画需求,所以谷歌在3.0开始,推出了属性动画(prope ...
- Android笔记(七十五) Android中的图片压缩
这几天在做图记的时候遇第一次遇到了OOM,好激动~~ 追究原因,是因为在ListView中加载的图片太大造成的,因为我使用的都是手机相机直接拍摄的照片,图片都比较大,所以在加载的时候会出现内存溢出,那 ...
- Android笔记(四十六) Android中的数据存储——XML(二)PULL解析
PULL 的工作原理: XML pull提供了开始元素和结束元素.当某个元素开始时,可以调用parser.nextText()从XML文档中提取所有字符数据.当解析到一个文档结束时,自动生成EndDo ...
- Android笔记(十五) Android中的基本组件——单选框和复选框
单选框和多选框通常用来在设置用户个人资料时候,选择性别.爱好等,不需要用户直接输入,直接在备选选项中选择,简单方便. 直接看代码: <?xml version="1.0" e ...
- Android笔记(六十六) android中的动画——XML文件定义属性动画
除了直接在java代码中定义动画之外,还可以使用xml文件定义动画,以便重用. 如果想要使用XML来编写动画,首先要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在 ...
- Android笔记(四十七) Android中的数据存储——XML(三)SAX解析
SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备. SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SA ...
- Android笔记(十) Android中的布局——表格布局
TableLayout运行我们使用表格的方式来排列控件,它的本质依然是线性布局.表格布局采用行.列的形式来管理控件,TableLayout并不需要明确的声明包含多少行多少列,而是通过添加TableRo ...
- 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)
1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...
- 论文阅读笔记四十五:Region Proposal by Guided Anchoring(CVPR2019)
论文原址:https://arxiv.org/abs/1901.03278 github:code will be available 摘要 区域anchor是现阶段目标检测方法的重要基石.大多数好的 ...
随机推荐
- Python3基础 tuple 使用格式化字符串进行输出
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...
- 命令mark
for i in `sudo /usr/local/sbin/fping -g 10.181.37.0/26 -p 10 -r 1 | grep alive | awk '{print $1 }'`; ...
- Spring cloud微服务安全实战-6-11sentinel之配置持久化
规则的持久化问题.现在的规则都是在内存里的,我们要写一些代码来编一些规则.启动以后规则在内存里了.如果你配置里面有sentinel的dashboard,有流量经过客户端的时候,它会把规则同步给Dash ...
- tomcat一闪而过,无法开启
记事本打开startup.bat,找到最后一句话::end,我们知道end表示结束的意思,:end是一个标记,我们在后面加上一句pause,然后启动该脚本 正常情况下回像下图显示 如果一闪而过的话,可 ...
- [LeetCode] 749. Contain Virus 包含病毒
A virus is spreading rapidly, and your task is to quarantine the infected area by installing walls. ...
- sshpass命令使用
1.直接远程连接某主机 sshpass -p {密码} ssh {用户名}@{主机IP} 2.远程连接指定ssh的端口 sshpass -p {密码} ssh -p ${端口} {用户名}@{主机IP ...
- 手贱重置了mysql密码,导致登陆不进去的解决办法
上午手残,重置了下MySQL的密码,导致用命令登陆不进去 由于版本的问题,导致网上的方法都不可用 折腾了一上午,摸索+参考官方文档,终于搞定 利用--init-file 第一步,关掉系统服务 ...
- AppCrawler安装使用
百度网盘: https://pan.baidu.com/s/1bpmR3eJ mac下安装appium 真机或者模拟器均可. 确保adb devices可以看到就行 启动appium 启动appium ...
- 移动测(APP)试与web端测试的区别
1.操作环境不同 移动端的测试环境是安卓操作环境或者iOS操作系统: web端操作环境一般是windows(如果你用的是MC电脑,那就是iOS操作系统). 2.页面的显示尺寸不同 移动端的尺寸比较多, ...
- 从Asp .net到Asp core (第一篇)《回顾Asp .net生命周期与管道机制》
从2016年微软收购了Xamarin整合到Visual Studio里并将其开源到现在已有三年多时间,从.net core 1.0 到现在的2.2,以及即将问世的3.0,我们看到微软正在跨平台之路越走 ...