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 文件 1.Javabeen 代码 packa ...

  5. Android XML解析器– XMLPullParser

    Welcome to android xml parser example using XMLPullParser. We will have a sample XML file that we wi ...

  6. android XML解析详解(封装好的工具类)

    常见的XML解析有哪几种? DOM解析; PULL解析;(android自带的解析XML的技术) JDOM解析; SAX解析; DOM4J PULL解析示例代码: <1> 我们要解析的XM ...

  7. android xml解析demo,Android解析自定义xml文件--Sax解析xml文件,测试demo(方案二)...

    转载请注明出处:http://blog.csdn.net/droyon/article/details/9346657 Sax解析xml 以下是测试Demo 运行程序类 public class Te ...

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

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

  9. android xml解析的三种方式

    2019独角兽企业重金招聘Python工程师标准>>> 在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX.Pull.Dom解析方式.最近做了 ...

  10. android xml 解析天气,Retrofit2解析天气API XML接口

    栗子: 友情提示:这是本人初次接触的记录篇,有坑是正常现象,欢迎指出. 具体返回格式: 北京 13:35 29 4级 28% 南风 04:59 19:23 72 52 极少数敏感人群应减少户外活动 良 ...

最新文章

  1. 没有为类型定义方法怎么办_拼多多开店没有流量怎么办?有什么方法?新手必看!...
  2. Sitecore7.5 安装指南 -- 从.EXE文件安装Sitecore CMS
  3. 编译动态库时遇到relocation R_X86_64_32 against a local symbol的错误
  4. mdpi is ok
  5. ODPS主备集群双向数据复制导致主备中心网络打爆问题
  6. OpenCV copyMakeBorder()来拓展边界
  7. linux内核内存映射实验报告,动手实践-Linux内存映射基础(上)
  8. 解决 【git checkout -b dev origin/dev】报错的问题
  9. 配置VSS2005的Internet访问(转)
  10. 居民身份证号码的含义
  11. 嵌入式Linux——学习经历
  12. 台式win7旗舰版如何调节屏幕亮度
  13. 学习笔记:贝塞尔曲线法
  14. 自己电脑中安装黑群辉NAS
  15. 分析武汉二手房房价信息
  16. AndroidLocalizationer 支持百度翻译
  17. InCallContrller内部逻辑
  18. Runtime+Compiler和Runtime-only如何选择?
  19. java技术:输入拼音自动提示汉字的方法
  20. android10官方刷机包下载,Android 11 喜讯!小米 10 率先尝鲜,官方刷机包发布下载...

热门文章

  1. java 停止for_java线程for循环没有循环完成就停止了,这是为什么?
  2. resnet网络结构_深度学习之16——残差网络(ResNet)
  3. java 判断天是星期及_java判断日期是星期几的方法总结
  4. python日志内容存储到文件里_Python中如何实现将logging日志保存到文件中
  5. 学生签到系统c代码_C语言实现简单学生学籍管理系统
  6. axios获取图片显示_vue中使用axios post上传头像/图片并实时显示到页面的方法
  7. mysql也能注册到eureka_为什么我的服务提供者和消费者都注册不到eureka注册中心?...
  8. 寻找唯一特等奖java,大工斩获唯一特等奖!这次,请为我工老师疯狂打call!
  9. (一) shario教程资料
  10. eclipse如何给main函数传参数