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. Android API之android.content.BroadcastReceiver

    android.content.BroadcastReceiver Base class for code that will receive intents sent by sendBroadcas ...

  2. Android API之Telephony.Threads

    1. Telephony.ThreadsColumns Columns for the "threads" table used by MMS and SMS. 在Telephon ...

  3. 航信电子发票开发(servlet请求方式)

    在系统用户交费后,需要打印发票,可以选择普票或者机打票(票据信息在系统中自定义设置的),也可以打印电子发票,这里对接的是航信的电子发票,请求方式非web服务,而是使用servlet通过HTTP请求的方 ...

  4. ios中GDataXML解析XML文档

    参考文章 http://blog.csdn.net/ryantang03/article/details/7868246 适合解析一个节点多个属性要用GDataXml 格式如下 <?xml ve ...

  5. ext3, ext4 和 reiserfs 文件系统性能对比

    : 创建空文件10000个的耗时 创建小文件,每个小文件使用512个blocks,一共创建10000个 创建一个2G文件的耗时 复制2G文件的耗时 删除2G大文件的耗时 删除10000个小文件的耗时 ...

  6. 使用 Chrome 开发者工具进行 JavaScript 问题定位与调试

    转自:https://www.ibm.com/developerworks/cn/web/1410_wangcy_chromejs/ 引言 Google Chrome 是由 Goole 公司开发的一款 ...

  7. I/O事件处理模型之Reactor和Proactor 【转】

    http://blog.ddup.us/?p=280 这篇博客说的很清楚,赞一个: 在编写服务端软件的时候,如何处理各种I/O事件是其中很重要的一部分.在Unix Network Programmin ...

  8. 忘记mysqlroot密码/我的电脑 管理服务里面没有mysql启动项/mysql启动不了net start mysql

    http://www.cnblogs.com/andy_tigger/archive/2012/04/12/2443652.html 通过绕过不需密码 http://www.jb51.net/arti ...

  9. 重整ADO.NET连接池相关资料

    https://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlconnection.connectionstring(VS.80) ...

  10. web前端学习笔记-瀑布流的算法分析与代码实现

    瀑布流效果目前应用很广泛,像花瓣,新浪轻博,蘑菇街,美丽说等好多网站都有.也有好多支持该效果的前段框架,今天学习了一下这种效果的实现,不依赖插件,自己动手分析实现过程,为了便于叙述清楚,分析中的一些名 ...