三种解析方法 DOM,SAX,XMLPullParse;你以为我要讲三种嘛 错 ,我只讲一种 ,其他两种我只是说下优缺点,

一、DOM解析器

优点:

DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。Node对象提供了一系列常量来代表结点的类型
,当开发人员获得某个Node类型后,就可以把Node节点转换成相应节点对象(Node的子类对象),以便于调用其特有的方法。
 Node对象提供了相应的方法去获得它的父结点或子结点。编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容.

缺点:

一次性的完全加载整个xml文件,需要消耗大量的内存。

二、SAX

优点:SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。

三 、 PullParse

Pull解析xml文件步骤:

1.先自己写一个xml文件,存一些天气信息

###拿到xml文件

InputStream is = getClassLoader().getResourceAsStream("weather.xml");

###拿到pull解析器

XmlPullParser xp = Xml.newPullParser();

2.开始解析
拿到指针所在当前节点的事件类型

int type = xp.getEventType();
 事件类型主要有五种
START_DOCUMENT:xml头的事件类型
END_DOCUMENT:xml尾的事件类型
START_TAG:开始节点的事件类型
END_TAG:结束节点的事件类型
TEXT:文本节点的事件类型

如果获取到的事件类型不是END_DOCUMENT,就说明解析还没有完成,如果是,解析完成,while循环结束

while(type != XmlPullParser.END_DOCUMENT)
当我们解析到不同节点时,需要进行不同的操作,所以判断一下当前节点的name
当解析到weather的开始节点时,new出list
当解析到city的开始节点时,创建city对象,创建对象是为了更方便的保存即将解析到的文本
当解析到name开始节点时,获取下一个节点的文本内容,temp、pm也是一样

case XmlPullParser.START_TAG:
//获取当前节点的名字
if("weather".equals(xp.getName())){
citys = new ArrayList<City>();
}
else if("city".equals(xp.getName())){
city = new City();
}
else if("name".equals(xp.getName())){
//获取当前节点的下一个节点的文本
String name = xp.nextText();
city.setName(name);
}
else if("temp".equals(xp.getName())){
String temp = xp.nextText();
city.setTemp(temp);
}
else if("pm".equals(xp.getName())){
String pm = xp.nextText();
city.setPm(pm);
}
break;

当解析到city的结束节点时,说明city的三个子节点已经全部解析完了,把city对象添加至list

case XmlPullParser.END_TAG:
if("city".equals(xp.getName())){
citys.add(city);
}

随便写个XML:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <weather>
  3. <city>
  4. <name>安阳</name>
  5. <temp>-8℃</temp>
  6. <pm25>120</pm25>
  7. </city>
  8. <city>
  9. <name>北京</name>
  10. <temp>-12℃</temp>
  11. <pm25>500</pm25>
  12. </city>
  13. <city>
  14. <name>上海</name>
  15. <temp>2℃</temp>
  16. <pm25>60</pm25>
  17. </city>
  18. </weather>

定义一个JavaBean 来装name temp pm25:

  1. package com.ace.pullparser;
  2.  
  3. public class City {
  4.  
  5. private String name;
  6. private String temp;
  7. private String pm25;
  8. public String getName() {
  9. return name;
  10. }
  11. public void setName(String name) {
  12. this.name = name;
  13. }
  14. public String getTemp() {
  15. return temp;
  16. }
  17. public void setTemp(String temp) {
  18. this.temp = temp;
  19. }
  20. public String getPm25() {
  21. return pm25;
  22. }
  23. public void setPm25(String pm25) {
  24. this.pm25 = pm25;
  25. }
  26. @Override
  27. public String toString() {
  28. return "City [name=" + name + ", temp=" + temp + ", pm25=" + pm25 + "]";
  29. }
  30.  
  31. }

MainActivity:

  1. package com.ace.pullparser;
  2.  
  3. import java.io.InputStream;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6.  
  7. import org.xmlpull.v1.XmlPullParser;
  8. import org.xmlpull.v1.XmlPullParserException;
  9.  
  10. import com.itheima.pullparser.domain.City;
  11.  
  12. import android.os.Bundle;
  13. import android.app.Activity;
  14. import android.util.Xml;
  15. import android.view.Menu;
  16. import android.view.View;
  17.  
  18. public class MainActivity extends Activity {
  19.  
  20. List<City> cityList;
  21. @Override
  22. protected void onCreate(Bundle savedInstanceState) {
  23. super.onCreate(savedInstanceState);
  24. setContentView(R.layout.activity_main);
  25.  
  26. }
  27.  
  28. public void click(View v){
  29. //获取天气信息xml文件(不用创建后台,把你创建的xml放到src目录下,getClassLoader().getResourceStream是读取src目录下文件的方法)
  30. InputStream is = getClassLoader().getResourceAsStream("weather.xml");
  31.  
  32. //获取xmlpull解析器
  33. XmlPullParser xp = Xml.newPullParser();
  34. try {
  35. //初始化
  36. xp.setInput(is, "gbk");
  37.  
  38. //获取当前节点的事件类型
  39. int type = xp.getEventType();
  40. City city = null;
  41. while(type != XmlPullParser.END_DOCUMENT){
  42. switch (type) {
  43. case XmlPullParser.START_TAG:
  44. //获取当前节点的名字
  45. if("weather".equals(xp.getName())){
  46. cityList = new ArrayList<City>();
  47. }
  48. else if("city".equals(xp.getName())){
  49. city = new City();
  50. }
  51. else if("name".equals(xp.getName())){
  52. //获取下一个节点的文本
  53. String name = xp.nextText();
  54. city.setName(name);
  55. }
  56. else if("temp".equals(xp.getName())){
  57. //获取下一个节点的文本,把指针移动至当前节点的结束节点
  58. String temp = xp.nextText();
  59. city.setTemp(temp);
  60. }
  61. else if("pm25".equals(xp.getName())){
  62. //获取下一个节点的文本
  63. String pm25 = xp.nextText();
  64. city.setPm25(pm25);
  65. }
  66. break;
  67. case XmlPullParser.END_TAG:
  68. if("city".equals(xp.getName())){
  69. cityList.add(city);
  70. }
  71. break;
  72.  
  73. }
  74. //把指针移动至下一个节点,并返回该节点的事件类型
  75. type = xp.next();
  76. }
  77. } catch (Exception e) {
  78. // TODO Auto-generated catch block
  79. e.printStackTrace();
  80. }
  81.  
  82. for (City city : cityList) {
  83. System.out.println(city.toString());
  84. }
  85. }
  86.  
  87. }

布局只有一个Button

  1. <Button
  2. android:layout_width="wrap_content"
  3. android:layout_height="wrap_content"
  4. android:text="获取天气信息"
  5. android:onClick="click"
  6. />

虽然很基础 但我慢慢写 把知识分享给大家 自己也复习了 很好很棒 所以我会坚持的

抱歉最近朋友结婚去浪了几天~未来几天会正常更新.今天带来XML文件解析的更多相关文章

  1. 去哪网实习总结:递归构建“流程运行顺序”的XML文件(JavaWeb)

    本来是以做数据挖掘的目的进去哪网的,结构却成了系统开发... 只是还是比較认真的做了三个月,老师非常认同我的工作态度和成果.. . 实习立即就要结束了,总结一下几点之前没有注意过的变成习惯和问题.分享 ...

  2. 根据XPATH去查看修改xml文件节点的内容

    首先给出xml文件解析的路径,然后去读取节点的内容. package com.inetpsa.eqc.threads; import java.util.List; import java.io.Fi ...

  3. 使用jdom操作xml文件 去除子节点带有命名空间

    package com.soft.common; import java.util.HashMap; import java.util.Map; import org.jdom2.Namespace; ...

  4. 【全网免费VIP观看】哔哩哔哩番剧解锁大会员-集合了优酷-爱奇艺-腾讯-芒果-乐视-ab站等全网vip视频免费破解去广告-高清普清电视观看-持续更新

    哔哩哔哩番剧解锁大会员-集合了优酷-爱奇艺-腾讯-芒果-乐视-ab站等全网vip视频免费破解去广告-高清普清电视观看-持续更新 前言 突然想看电视,结果 没有VIP 又不想花钱,这免费的不久来啦. 示 ...

  5. 今天朋友带领去谷歌ok2eat 餐厅吃免费午餐

    中午去队友公司免费吃饭.朋友带我们去她的楼下吃,就算是googler真的也不是所有cafe都知道,感谢朋友带领.

  6. 由SOAP说开去 - - 谈谈WebServices、RMI、RPC、SOA、REST、XML、JSON

    引子: 关于SOAP其实我一直模模糊糊不太理解,这种模模糊糊的感觉表述起来是这样: 在使用web服务时(功能接口),本来我就可以通过安卓中固有的http类(使用http协议),来发送http请求,并且 ...

  7. maven 结合mybaits整合框架,打包时mapper.xml文件,mapper目录打不进war包去问题

    首先,来看下MAVENx项目标准的目录结构: 一般情况下,我们用到的资源文件(各种xml,properites,xsd文件等)都放在src/main/resources下面,利用maven打包时,ma ...

  8. 去哪网实习总结:JavaWeb中文传參乱码问题的解决(JavaWeb)

    本来是以做数据挖掘的目的进去哪网的.结构却成了系统开发... 只是还是比較认真的做了三个月.老师非常认同我的工作态度和成果... 实习立即就要结束了,总结一下几点之前没有注意过的变成习惯和问题,分享给 ...

  9. 去哪网实习总结:用到的easyui组件总结(JavaWeb)

    本来是以做数据挖掘的目的进去哪网的,结构却成了系统开发... 只是还是比較认真的做了三个月,老师非常认同我的工作态度和成果.. . 实习立即就要结束了,总结一下几点之前没有注意过的变成习惯和问题,分享 ...

随机推荐

  1. 操作系统下spinlock锁解析、模拟及损耗分析

    关于spinlock 我们在知道什么是spinlock之前,还需要知道为什么需要这个spinlock?spinlock本质就是锁,提到锁,我们就回到了多线程编程的混沌初期,为了实现多线程编程,操作系统 ...

  2. SQL/T-SQL实例参考-2

    对多关联查询,查询多中的记录,但是返回一的结果集 子查询语法 --一对多关联查询,查询多中的记录,但是返回一的结果集 SELECT C.* FROM ( SELECT A.BasicID FROM [ ...

  3. LogNet4

    ASP.Net MVC 项目中添加LogNet4 1,创建ASP.NET MVC项目 2,NuGet或者直接下载log4net.dll 并安装 3 在配置文件 web.config 加入 如下代码 & ...

  4. Unite Shanghai 2019全日程曝光(建议收藏)

    https://mp.weixin.qq.com/s/KvAyXpDhqWROtTX1Ol3a4Q 5月10-12日,Unite Shanghai 2019即将在上海国际会议中心正式开幕.本次大会共设 ...

  5. vim使用及vimrc配置

    参考文章 https://segmentfault.com/a/1190000011466454 如有侵权,请联系本人删除!

  6. python 面向对象十一 super函数

    python 面向对象十一 super函数   super函数用来解决钻石继承. 一.python的继承以及调用父类成员 父类: class Base(object): def __init__(se ...

  7. 【SSO单点系列】(5):CAS4.0 单点流程序列图

    刚过元旦假期,感觉自己好久没写博客了,今天更新一篇,主要是CAS 的一个流程图. ps: 这两张图 是直接从官网上找的,都是简单的英语,我这种英语四级没过都看得懂,大家应该没有压力. 1.CAS 基本 ...

  8. JavaScript学习笔记——3.对象

    JavaScript 对象 - 创建对象 1- var obj = new Object(); 2- var obj = {}; *例子:var person = {Name:"Hack&q ...

  9. 【python】10分钟教你用python一行代码搞点大新闻

    准备 相信各位对python的语言简洁已经深有领会了.那么,今天就带大家一探究竟.看看一行python代码究竟能干些什么大新闻.赶紧抄起手中的家伙,跟我来试试吧. 首先你得先在命令行进入python. ...

  10. 条目六《当心C++编译器中最烦人的分析机制》

    当心C++编译器中最烦人的分析机制 C++是较为底层的面相对象语言,在底层的语法规则分析中,有很多隐藏的分析机制. C++中的普遍规律相符,即尽可能地解释为函数声明. 把形式参数的声明用括号括起来是非 ...