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. Nginx自定义404页面

    指定一个错误页面: error_page 404 /404.html; location = /404.html { root /usr/share/nginx/html; } 指定一个url地址: ...

  2. [转载]TortoiseGit安装与使用

    原文地址:TortoiseGit安装与使用作者:了凡春秋 之前一直用SVN做项目开发,确实感觉这些版本控制工具非常实用,尤其是在一个团队开发项目的时候.最近偶然看到一个新的版本管理工具Git,它本来是 ...

  3. 自动化安装smokeping-2.6.11脚本

    自动化安装Smokeping-2.6.11脚本 一.目的 1.1 监控目的 为方便监测各数据中心网络状况,自定义全国各节点,从而发现网络异常,判断网络故障. 1.2 本文目的 快速部署Smokepin ...

  4. linux运维常见英文报错中文翻译(菜鸟必知)

    linux常见英文报错中文翻译(菜鸟必知) 1.command not found  命令没有找到 2.No such file or directory  没有这个文件或目录 3.Permissio ...

  5. HDU 1556 Color the ball (数状数组)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  6. 【Servlet】使用org.eclipse.jetty实现小型的Servlet服务器

    import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpSer ...

  7. 【java】自定义异常类

    目录结构: contents structure [+] 为什么需要自定义异常类 自定义异常的方式 实例 日常日志 一,为什么需要自定义异常类 当java中的异常类型没有能够满足我们所需的异常的时候就 ...

  8. tomcat服务器配置字符集为utf-8-彻底解决中文乱码问题

    <Connector port="8070" protocol="HTTP/1.1" connectionTimeout="20000" ...

  9. PowerDsigner 16逆向工程导入mysql

    由于日常数据建模经常使用PowerDesigner,使用逆向工程能更加快速的生成模型提高效率,所以总结使用如下: 1.      安装MYSQL的ODBC驱动 Connector/ODBC 5.1.1 ...

  10. PowerShell 获取Site Collection下被签出的文件

    由于权限的设置,当文件被签出时导致别人不可见了,这对校验文件个数的人来说着实是件烦恼的事.幸好利用PowerShell,可以获取Site Collection下被签出的文件. Resolution A ...