Android 下用 Pull 解析和生成 XML
Java 中是可以用 SAX 和 DOM 解析 XML 的,虽然在 Android 下也可以用这2中方式,但是还是推荐用 Pull。Pull 使用简单,效率相对高,Android 下是集成了 Pull ,所以并不需要用到第三方的包。
下面来举例子,我要向 XML 文档中读写学生信息,首先我定义一个学生类,包含ID、学号、姓名和年龄
public class Student {
public Student() {};
public Student(int id, int number, String name, int age) {
this.id = id;
this.number = number;
this.name = name;
this.age = age;
}
private int id;
private int number;
private String name;
private int age;
public int getId() {
return id;
}
public int getNumber() {
return number;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setId(int id) {
this.id = id;
}
public void setNumber(int number) {
this.number = number;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [number=" + number + ", name=" + name + ", age=" + age
+ "]";
}
}
要读取的 XML 文件里面内容是这样的
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id="1">
<number>33</number>
<name>张三</name>
<age>20</age>
</student>
<student id="2">
<number>29</number>
<name>李四</name>
<age>19</age>
</student>
</students>
然后我写了个 XmlHelper 类,有个静态方法 getStudes,该方法接受输入流,返回学生信息的集合
public static List<Student> getStudents(InputStream xml) throws Exception {
List<Student> students = null;
Student student = null;
XmlPullParser parser = Xml.newPullParser(); //得到 Pull 解析器
parser.setInput(xml, "UTF-8"); //设置输入,编码为 UTF-8
int event = parser.getEventType(); //得到事件类型,每读取到一个位置都有相对的事件类型
while (XmlPullParser.END_DOCUMENT != event) { //没到文档结尾就要循环读取
switch (event) {
case XmlPullParser.START_DOCUMENT: //这是文档开始事件,我们在这个地方做一些初始化工作
students = new ArrayList<Student>();
break;
case XmlPullParser.START_TAG: //标签开始事件,标签开始就是上面XML中的 <students>、<student>、<number>、<name>、和 <age>
if (parser.getName().equals("student")) { //读取到这个 student 标签就说明下面就是我需要的信息了
int id = Integer.valueOf(parser.getAttributeValue(0));
student = new Student();
student.setId(id);
}
if (null != student) { //避免出现空指针,先判断一下再继续
if (parser.getName().equals("number")) {
int number = Integer.valueOf(parser.nextText()); // nextText() 就是得到标签后面的文本
student.setNumber(number);
}else if (parser.getName().equals("name")) {
String name = parser.nextText();
student.setName(name);
}else if (parser.getName().equals("age")) {
int age = Integer.valueOf(parser.nextText());
student.setAge(age);
}
}
break;
case XmlPullParser.END_TAG:
//读取到 </student> 时说明一个学生的信息已经读取完了
if (parser.getName().equals("student")) {
students.add(student);
student = null;
}
break;
default:
break;
}
event = parser.next(); //一个读取完了,就下一个,如此循环
}
return students;
}
读取就是这样了,接下来写怎样生成。generate 方法,接受学生信息集合和输出流
其实成成很好理解,就是按照顺序一块信息一块信息写下去
public static void generate(List<Student> students, OutputStream os) throws Exception {
XmlSerializer serializer = Xml.newSerializer(); //得到序列化器
serializer.setOutput(os, "UTF-8"); //设置输出
serializer.startDocument("UTF-8", true); //文档开始了
serializer.startTag(null, "students"); //标签开始了
for (Student student : students) {
serializer.startTag(null, "student"); //子标签开始了
serializer.attribute(null, "id", String.valueOf(student.getId())); //指定该标签属性,这里是ID
//下面3个就是生成学号、姓名和年龄
serializer.startTag(null, "number");
serializer.text(String.valueOf(student.getNumber()));
serializer.endTag(null, "number");
serializer.startTag(null, "name");
serializer.text(student.getName());
serializer.endTag(null, "name");
serializer.startTag(null, "age");
serializer.text(String.valueOf(student.getAge()));
serializer.endTag(null, "age");
serializer.endTag(null, "student"); //子标签结束
}
serializer.endTag(null, "students"); //标签结束
serializer.endDocument(); //文档结束
os.flush(); //如果传入的输出流不是文件,就就要刷新一下缓冲区
os.close();
}
}
然后咱来写一个测试单元来测试一下这俩方法
public class XmlHelperTest extends AndroidTestCase {
private static final String TAG = "XmlHelperTest";
public void testGetStudents() throws Exception {
InputStream xmlIstm = this.getClass().getClassLoader().getResourceAsStream("students.xml");
List<Student> students = XmlHelper.getStudents(xmlIstm);
for (Student student : students) {
Log.i(TAG, student.toString());
}
}
public void testGenerate() throws Exception {
List<Student> students = new ArrayList<Student>();
students.add(new Student(1, 13, "小建", 21));
students.add(new Student(2, 16, "大康", 20));
File xmlFile = new File(getContext().getFilesDir(), "students.xml");
FileOutputStream fos = new FileOutputStream(xmlFile);
try {
XmlHelper.generate(students, fos);
Log.i(TAG, "生成XML文件成功");
} catch(Exception e) {
Log.i(TAG, "生成XML文件失败:" + e.getMessage());
}
}
}
-----------------------
楼主以前都是写 C++ 的,也才学 Android 不久,加油吧。
好久没写博客了,感觉吧,还是应该坚持写下去。
Android 下用 Pull 解析和生成 XML的更多相关文章
- 使用Pull解析器生成XML文件和读取xml文件
有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使 ...
- 使用Pull解析器生成XML文件
有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使 ...
- 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)
1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...
- SAX解析和生成XML文档
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui031 ...
- maven中使用dom4j解析、生成XML的简易方法
此片文章主要写一些关于如何在maven工程中使用dom4j来解析或生成XML的建议方法,实际可使用的写法不仅限于如下所写的样例代码.此处进攻快速入手和提供思路使用. 首先配置pom.xml中的依赖的包 ...
- 黎活明8天快速掌握android视频教程--15_采用Pull解析器解析和生成XML内容
1.该项目主要有下面的两个作用 (1)将xml文件解析成对象的List对象,xml文件可以来自手机本地,也可以来自服务器返回的xml数据 (2)强list对象保存成xml文件,xml保存到手机的内存卡 ...
- Android开发8——利用pull解析器读写XML文件
一.基本介绍 对XML解析有SAX和DOM等多种方式,Android中极力推荐xmlpull方式解析xml.xmlpull不仅可用在Android上同样也适用于javase,但在javase环境中需自 ...
- android下基本json串的生成与解析
以前就用过json串,不过是在java环境下面,如今转移到android环境下,java里面生成解析json串的jar包与android中自带的冲突,所以也只能用安卓自带的. 先前查网上的资料,感 ...
- 15_采用Pull解析器解析和生成XML内容
java还提供SAX和DOM用于解析XML Android还集成了Pull解析器——推荐 package cn.itcast.service; import java.io.InputStream; ...
随机推荐
- Java反射结合JDBC写的一个通用DAO
以前写反射只是用在了与设计模式的结合上,并没有考虑到反射可以与DAO结合.也是一个偶然的机会,被正在上培训的老师点到这个问题,才考虑到这个可能性,于是上网参考各种代码,然后自己动手开发了一个通用DAO ...
- 几个模式识别和计算机视觉相关的Matlab工具箱
模式识别.计算机视觉.图像处理等领域大部分是对一些图像等数据的处理,比较常用的语言是C++和Matlab,相应也对应很多库,象opencv等,都是很好用功能也很强大,但是对于数据处理更方便的应该还是M ...
- uboot全局变量
一.global_data(include/asm-arm/global_data.h) typedef struct global_data { bd_t *bd; unsigned long fl ...
- IOSアプリケーション開発環境の構築
IOSアプリケーション開発環境の要求 1) IOSシステムの構造はそのようになっています: 2) ハードウエアの方の要求: コンピューター a) デュアルコアCPU b) 8 gメモリ(開 ...
- XP系统VPN设置
为了解除公司上网策略限制,或者为了上Google,Facebook,都可以通过设置VPN实现. 要使用VPN需要到VPN服务商注册,链接VPN服务商. ======================== ...
- unity Character Controller 点滴
unity Character Controller 点滴 1.今天在做角色的时候,发现人物跳不起来,原来设置这个属性即可,Step Offset, 这个是台阶的高度,这个值设置的越大,人物爬的越高 ...
- C语言嵌入式系统编程修炼之二:软件架构篇
模块划分的"划"是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求.C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能(依功能进行 ...
- 《Effective C++》条款26 防卫潜伏的ambiguity模棱两可的状态
每个人都有思想.有些人相信自由经济学,有些人相信来生.有些人甚至相信COBOL是一种真正的程序设计语言.C++也有一种思想:它认为潜在的二义性不是一种错误.ambiguity 这是潜在二义性的一个例子 ...
- 设计模式之(三)Proxy模式
今天学习Proxy模式.代理模式是在对已有对象操作困难或者不太方便时,选择用代理的方式对对象进行访问.Proxy实现的方法必须和被代理对象一致. 举一个简单的例子, 有一个Math类实现了IMath接 ...
- 通过Delphi获得qq安装路径
procedure TForm1.Button2Click(Sender: TObject); var Reg:TRegistry; Val:TStrings; ii:System.Integer; ...