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. Maven + SpringMVC项目集成Swagger

    Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参数和模型紧密集成到服 ...

  2. uitextview根据内容算高度

    UITextView根据内容自动改变frame 分类: iOS2013-03-08 07:27 190人阅读 评论(0) 收藏 举报 注意点: 在textview中计算string占据的高度不能使用[ ...

  3. Ubuntu 10.04里安装强大抓图工具Shutter

    Shutter 原名叫GScrot,是一款Linux下很强大的抓图工具,支持截取全屏幕,窗口,自选区域以及网页的图像,并且截取后的图像还可以简单编辑,Shutter还支持插件功能,矩齿,边缘化,碎纸, ...

  4. 快排法求第k大

    快排法求第k大,复杂度为O(n) import com.sun.media.sound.SoftTuning; import java.util.Arrays; import java.util.Ra ...

  5. Python import容易犯的一个错误

    有时,我们需要手动添加一些依赖 b.py import sys sys.path.insert(0,"haha")#引用haha目录下的a文件 当使用时 import a impo ...

  6. Python实现鸢尾花数据集分类问题——基于skearn的LogisticRegression

    Python实现鸢尾花数据集分类问题——基于skearn的LogisticRegression 一. 逻辑回归 逻辑回归(Logistic Regression)是用于处理因变量为分类变量的回归问题, ...

  7. web前端工程师在移动互联网时代里的地位问题 为啥C/S系统在PC端没有流行起来,却在移动互联网下流行了起来 为啥移动端的浏览器在很多应用里都是靠边站,人们更加倾向于先麻烦自己一下,下载安装个客户端APP

    web前端工程师在移动互联网时代里的地位问题 支付宝十周年推出了一个新产品:支付宝的十年账单,我也赶个时髦查看了一下我的支付宝十年账单,哎,感慨自己真是太屌丝了,不过这只是说明我使用淘宝少了,当我大规 ...

  8. 【jsp】怎么在jsp文件中引入静态文件(.js .css)

    如果在jsp文件中引入静态文件比如(.js或.css等等),可以在使用 /项目名称/路径 的方式,但是这种方式如果在修改了项目了名称后就显得比较麻烦了.除了之外还许多方式,比如相对路径等等.一般情况下 ...

  9. solr 5.3.1安装配置

    1.下载Solr5.3.1 http://mirror.bit.edu.cn/apache/lucene/solr/5.3.1/ wget http://mirror.bit.edu.cn/apach ...

  10. numpy 字符数组和字符操作(略)

    字符数组 该部分内容见 numpy-ref-1.14.5 中的 1.6.4 字符数组Character arrays (numpy.char) 和 3.1.4 创建字符数组Creating chara ...