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;}@Overridepublic 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-8int 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 不久,加油吧。
好久没写博客了,感觉吧,还是应该坚持写下去。

更多相关文章

  1. 【转】Android内核开发:如何统计系统的启动时间
  2. 一个使用FFmpeg库读取3gp视频的例子-Android中使用FFmpeg媒体库(
  3. Android(安卓)Log分析
  4. Android之SQlite数据库
  5. Android中文翻译 - NFC基础
  6. Android(安卓)UI 优化 使用和 标签
  7. android 兼容各个版本 读取通讯录
  8. Unity调用高德地图API,获取定位信息(Android)
  9. UiAutomator通过ant实现快速调试

随机推荐

  1. Android Txt文本阅读器源码
  2. Material Design 之 Theme
  3. android不死服务的实现方法
  4. EditText失去焦点隐藏软键盘
  5. android弹出输入法时的模式
  6. Android通过HttpURLConnection上传多个文
  7. Android之手机振动的设置
  8. Android源代码下载过程及遇到的问题
  9. android 8.0 通知适配
  10. Error Installing APK