XML解析三种方式

DOM

通用性强,它会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据;

简单直观,但需要将文档读取到内存,并不太适合移动设备;

SAX

SAX是一个解析速度快并且占用内存少的xml解析器;

采用事件驱动,它并不需要解析整个文档;

实现:继承DefaultHandler,覆写startElement、endElement、characters等方法;

PULL

Android自带的XML解析器,和SAX基本类似,也是事件驱动,不同的是PULL事件返回的是数值型;推荐使用。

PULL解析XML核心代码

[java] view plaincopy

 
  1. XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
  2. parser.setInput(fileInputStream, “utf-8”);//设置数据源编码
  3. int eventCode = parser.getEventType();//获取事件类型
  4. while(eventCode != XmlPullParser.END_DOCUMENT)  {
  5. switch (eventCode){
  6. case XmlPullParser.START_DOCUMENT: //开始读取XML文档
  7. //实例化集合类
  8. break;
  9. case XmlPullParser.START_TAG://开始读取某个标签
  10. if("person".equals(parser.getName())) {
  11. //通过getName判断读到哪个标签,然后通过nextText()获取文本节点值,或通过getAttributeValue(i)获取属性节点值
  12. }
  13. break;
  14. case XmlPullParser.END_TAG://读完一个Person,可以将其添加到集合类中
  15. break;
  16. }
  17. parser.next();
  18. }

PULL解析XML示例方法

 
Java方法
[java] view plaincopy

 
  1. public static List<Person> readXML(InputStream inStream) {
  2. XmlPullParser parser = Xml.newPullParser();
  3. try {
  4. parser.setInput(inStream, "UTF-8");// 设置数据源编码
  5. int eventType = parser.getEventType();// 获取事件类型
  6. Person currentPerson = null;
  7. List<Person> persons = null;
  8. while (eventType != XmlPullParser.END_DOCUMENT) {
  9. switch (eventType) {
  10. case XmlPullParser.START_DOCUMENT:// 文档开始事件,可以进行数据初始化处理
  11. persons = new ArrayList<Person>();// 实例化集合类
  12. break;
  13. case XmlPullParser.START_TAG://开始读取某个标签
  14. //通过getName判断读到哪个标签,然后通过nextText()获取文本节点值,或通过getAttributeValue(i)获取属性节点值
  15. String name = parser.getName();
  16. if (name.equalsIgnoreCase("person")) {
  17. currentPerson = new Person();
  18. currentPerson.setId(new Integer(parser.getAttributeValue(null, "id")));
  19. } else if (currentPerson != null) {
  20. if (name.equalsIgnoreCase("name")) {
  21. currentPerson.setName(parser.nextText());// 如果后面是Text元素,即返回它的值
  22. } else if (name.equalsIgnoreCase("age")) {
  23. currentPerson.setAge(new Short(parser.nextText()));
  24. }
  25. }
  26. break;
  27. case XmlPullParser.END_TAG:// 结束元素事件
  28. //读完一个Person,可以将其添加到集合类中
  29. if (parser.getName().equalsIgnoreCase("person")&& currentPerson != null) {
  30. persons.add(currentPerson);
  31. currentPerson = null;
  32. }
  33. break;
  34. }
  35. eventType = parser.next();
  36. }
  37. inStream.close();
  38. return persons;
  39. } catch (Exception e) {
  40. e.printStackTrace();
  41. }
  42. return null;
  43. }

应用

XML文件
[html] view plaincopy

 
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <persons>
  3. <person id="23">
  4. <name>孙洋洋</name>
  5. <age>30</age>
  6. </person>
  7. <person id="20">
  8. <name>孙彬彬</name>
  9. <age>25</age>
  10. </person>
  11. </persons>

Activity文件

[java] view plaincopy

 
  1. package com.app.data;
  2. import java.io.BufferedWriter;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.FileOutputStream;
  7. import java.io.InputStream;
  8. import java.io.OutputStreamWriter;
  9. import java.net.HttpURLConnection;
  10. import java.net.URL;
  11. import java.util.ArrayList;
  12. import java.util.HashMap;
  13. import java.util.List;
  14. import org.xmlpull.v1.XmlPullParser;
  15. import org.xmlpull.v1.XmlPullParserException;
  16. import org.xmlpull.v1.XmlPullParserFactory;
  17. import com.app.other.Person;
  18. import android.app.Activity;
  19. import android.os.Bundle;
  20. import android.util.Xml;
  21. import android.widget.TextView;
  22. public class XMLActivity extends Activity {
  23. @Override
  24. protected void onCreate(Bundle savedInstanceState) {
  25. // TODO Auto-generated method stub
  26. super.onCreate(savedInstanceState);
  27. setContentView(R.layout.activity_xml);
  28. StringBuilder sBuilder = new StringBuilder();
  29. File xmlFile = new File("/mnt/sdcard/App/person.xml");
  30. try {
  31. FileInputStream inputStream = new FileInputStream(xmlFile);
  32. //          URL url = new URL("http://10.0.2.2:8888/android/person.xml");
  33. //          HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
  34. //          InputStream inputStream = urlConnection.getInputStream();
  35. List<Person> list = readXML(inputStream);
  36. for (int i = 0; i < list.size(); i++) {
  37. Person person = list.get(i);
  38. sBuilder.append("第-" + i + "-条记录:\n");
  39. sBuilder.append("getName--" + person.getName() + "\n");
  40. sBuilder.append("getAge--" + person.getAge() + "\n");
  41. sBuilder.append("getId--" + person.getId() + "\n");
  42. }
  43. inputStream.close();
  44. } catch (Exception e) {
  45. // TODO Auto-generated catch block
  46. e.printStackTrace();
  47. }
  48. TextView textView = (TextView)findViewById(R.id.textView2);
  49. textView.setText(sBuilder);
  50. }
  51. public static List<Person> readXML(InputStream inStream) {
  52. XmlPullParser parser = Xml.newPullParser();
  53. try {
  54. parser.setInput(inStream, "UTF-8");// 设置数据源编码
  55. int eventType = parser.getEventType();// 获取事件类型
  56. Person currentPerson = null;
  57. List<Person> persons = null;
  58. while (eventType != XmlPullParser.END_DOCUMENT) {
  59. switch (eventType) {
  60. case XmlPullParser.START_DOCUMENT:// 文档开始事件,可以进行数据初始化处理
  61. persons = new ArrayList<Person>();// 实例化集合类
  62. break;
  63. case XmlPullParser.START_TAG://开始读取某个标签
  64. //通过getName判断读到哪个标签,然后通过nextText()获取文本节点值,或通过getAttributeValue(i)获取属性节点值
  65. String name = parser.getName();
  66. if (name.equalsIgnoreCase("person")) {
  67. currentPerson = new Person();
  68. currentPerson.setId(new Integer(parser.getAttributeValue(null, "id")));
  69. } else if (currentPerson != null) {
  70. if (name.equalsIgnoreCase("name")) {
  71. currentPerson.setName(parser.nextText());// 如果后面是Text元素,即返回它的值
  72. } else if (name.equalsIgnoreCase("age")) {
  73. currentPerson.setAge(new Short(parser.nextText()));
  74. }
  75. }
  76. break;
  77. case XmlPullParser.END_TAG:// 结束元素事件
  78. //读完一个Person,可以将其添加到集合类中
  79. if (parser.getName().equalsIgnoreCase("person")&& currentPerson != null) {
  80. persons.add(currentPerson);
  81. currentPerson = null;
  82. }
  83. break;
  84. }
  85. eventType = parser.next();
  86. }
  87. inStream.close();
  88. return persons;
  89. } catch (Exception e) {
  90. e.printStackTrace();
  91. }
  92. return null;
  93. }
  94. }

XML布局文件

[html] view plaincopy

 
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. android:padding="15dp" >
  7. <TextView
  8. android:id="@+id/textView1"
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:text="XML文件读取"
  12. android:layout_gravity="center_horizontal" />
  13. <TextView
  14. android:id="@+id/textView2"
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content"
  17. android:text="TextView" />
  18. </LinearLayout>

XML文件位置

 
 
 
执行结果:
 
 

Android,XML解析的更多相关文章

  1. android XMl 解析神奇xstream 六: 把集合list 转化为 XML文档

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  2. android XMl 解析神奇xstream 五: 把复杂对象转换成 xml ,并写入SD卡中的xml文件

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  3. android XMl 解析神奇xstream 四: 将复杂的xml文件解析为对象

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  4. android XMl 解析神奇xstream 三: 把复杂对象转换成 xml

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  5. android XMl 解析神奇xstream 二: 把对象转换成xml

    前言:对xstream不理解的请看:android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 1.Javabeen 代码 packa ...

  6. Android] Android XML解析学习——方式比较

     [Android] Android XML解析学习——方式比较 (ZT)  分类: 嵌入式 (From:http://blog.csdn.net/ichliebephone/article/deta ...

  7. Android xml 解析

    XML 经常使用的三种解析方式: DOM: 所有载入到内存,生成一个树状结构,占用内存比較大. SAJ: 採用事件驱动,速度快,效率高,不支持回退. PULL:也是採用事件驱动,语法简洁. 步骤: 1 ...

  8. Android XML解析器的问题

    最近在项目中遇到了一个解析XML的问题,我们是用android自带的DOM解析器来解析XML的,但发现了一个android的问题,那就是在2.3的SDK上面,无法解析像<, >, 等字符串 ...

  9. android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件

    简介 XStream 是一个开源项目,一套简单实用的类库,用于序列化对象与 XML 对象之间的相互转换. 将 XML 文件内容解析为一个对象或将一个对象序列化为 XML 文件. 1.下载工具 xstr ...

  10. android XML解析器全解案例

    1.使用pull解析 package com.example.myxml; import java.io.InputStream; import java.util.ArrayList; import ...

随机推荐

  1. Asp.Net通过ODBC连接Oracle数据库

    本来有个项目是通过安装Oracle client然后让asp.net引用System.Data.OracleClient来访问Oracle数据库的,但是不知道为什么老是报:ORA-12170:连接超时 ...

  2. NFC手机上基于软件的卡模拟 重大利好还是安全噩梦?(转)

    Software Card Emulation in NFC-enabled Mobile Phones: GreatAdvantage or Security Nightmare? Michael ...

  3. (原+译)pytorch中保存和载入模型

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/8108466.html 参考网址: http://pytorch.org/docs/master/not ...

  4. QQ模仿之弹窗ADDFriend事件

    大家自己分析吧 #pragma once //演示QQ2009 #define WINDOW_WIDTH 250 //窗口宽度 #define WINDOW_HEIGHT 600 //窗口高度 str ...

  5. Python学习笔记(九)—— 函数

    一.函数调用: 1.python内部函数查询:http://docs.python.org/3/library/functions.html#abs 2.注意调用函数的参数个数和类型. 3.函数名其实 ...

  6. 构建高性能web之路------mysql读写分离实战(转)

    一个完整的mysql读写分离环境包括以下几个部分: 应用程序client database proxy database集群 在本次实战中,应用程序client基于c3p0连接后端的database ...

  7. sqlserver不太常见的,可能常见但又疑问的tsql语句

    2013年10月29日16:01:58 当数据有 time类型列时候,比如 打电话的通话时长,我们查询时候不方便,我们可以添加一个冗余列,直接统计秒 ,但是 后期知道的,现在我把例如 00:12:23 ...

  8. Java Nashorn--Part 4

    Nashorn 和 javax.script 包 Nashorn 并不是第一个在 Java 平台上运行的脚本语言.在Java 6 就提供了 javax.script java 包,它为脚本语言引擎提供 ...

  9. 第2章 Python基础-字符编码&数据类型 综合 练习题

    1.转换 将字符串s = "alex"转换成列表 s = "alex" s_list = list(s) print(s_list) 将字符串s = " ...

  10. python appium 有道云笔记分享文章到qq

    有道云添加一个笔记,笔记的title为aff 使用appium 把这篇文章分享到qq,前提是android里面有登录qq Python代码 from appium import webdriver i ...