抱歉最近朋友结婚去浪了几天~未来几天会正常更新.今天带来XML文件解析
三种解析方法 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:
- <?xml version="1.0" encoding="utf-8"?>
- <weather>
- <city>
- <name>安阳</name>
- <temp>-8℃</temp>
- <pm25>120</pm25>
- </city>
- <city>
- <name>北京</name>
- <temp>-12℃</temp>
- <pm25>500</pm25>
- </city>
- <city>
- <name>上海</name>
- <temp>2℃</temp>
- <pm25>60</pm25>
- </city>
- </weather>
定义一个JavaBean 来装name temp pm25:
- package com.ace.pullparser;
- public class City {
- private String name;
- private String temp;
- private String pm25;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getTemp() {
- return temp;
- }
- public void setTemp(String temp) {
- this.temp = temp;
- }
- public String getPm25() {
- return pm25;
- }
- public void setPm25(String pm25) {
- this.pm25 = pm25;
- }
- @Override
- public String toString() {
- return "City [name=" + name + ", temp=" + temp + ", pm25=" + pm25 + "]";
- }
- }
MainActivity:
- package com.ace.pullparser;
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.List;
- import org.xmlpull.v1.XmlPullParser;
- import org.xmlpull.v1.XmlPullParserException;
- import com.itheima.pullparser.domain.City;
- import android.os.Bundle;
- import android.app.Activity;
- import android.util.Xml;
- import android.view.Menu;
- import android.view.View;
- public class MainActivity extends Activity {
- List<City> cityList;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- }
- public void click(View v){
- //获取天气信息xml文件(不用创建后台,把你创建的xml放到src目录下,getClassLoader().getResourceStream是读取src目录下文件的方法)
- InputStream is = getClassLoader().getResourceAsStream("weather.xml");
- //获取xmlpull解析器
- XmlPullParser xp = Xml.newPullParser();
- try {
- //初始化
- xp.setInput(is, "gbk");
- //获取当前节点的事件类型
- int type = xp.getEventType();
- City city = null;
- while(type != XmlPullParser.END_DOCUMENT){
- switch (type) {
- case XmlPullParser.START_TAG:
- //获取当前节点的名字
- if("weather".equals(xp.getName())){
- cityList = 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("pm25".equals(xp.getName())){
- //获取下一个节点的文本
- String pm25 = xp.nextText();
- city.setPm25(pm25);
- }
- break;
- case XmlPullParser.END_TAG:
- if("city".equals(xp.getName())){
- cityList.add(city);
- }
- break;
- }
- //把指针移动至下一个节点,并返回该节点的事件类型
- type = xp.next();
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- for (City city : cityList) {
- System.out.println(city.toString());
- }
- }
- }
布局只有一个Button
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="获取天气信息"
- android:onClick="click"
- />
虽然很基础 但我慢慢写 把知识分享给大家 自己也复习了 很好很棒 所以我会坚持的
抱歉最近朋友结婚去浪了几天~未来几天会正常更新.今天带来XML文件解析的更多相关文章
- 去哪网实习总结:递归构建“流程运行顺序”的XML文件(JavaWeb)
本来是以做数据挖掘的目的进去哪网的,结构却成了系统开发... 只是还是比較认真的做了三个月,老师非常认同我的工作态度和成果.. . 实习立即就要结束了,总结一下几点之前没有注意过的变成习惯和问题.分享 ...
- 根据XPATH去查看修改xml文件节点的内容
首先给出xml文件解析的路径,然后去读取节点的内容. package com.inetpsa.eqc.threads; import java.util.List; import java.io.Fi ...
- 使用jdom操作xml文件 去除子节点带有命名空间
package com.soft.common; import java.util.HashMap; import java.util.Map; import org.jdom2.Namespace; ...
- 【全网免费VIP观看】哔哩哔哩番剧解锁大会员-集合了优酷-爱奇艺-腾讯-芒果-乐视-ab站等全网vip视频免费破解去广告-高清普清电视观看-持续更新
哔哩哔哩番剧解锁大会员-集合了优酷-爱奇艺-腾讯-芒果-乐视-ab站等全网vip视频免费破解去广告-高清普清电视观看-持续更新 前言 突然想看电视,结果 没有VIP 又不想花钱,这免费的不久来啦. 示 ...
- 今天朋友带领去谷歌ok2eat 餐厅吃免费午餐
中午去队友公司免费吃饭.朋友带我们去她的楼下吃,就算是googler真的也不是所有cafe都知道,感谢朋友带领.
- 由SOAP说开去 - - 谈谈WebServices、RMI、RPC、SOA、REST、XML、JSON
引子: 关于SOAP其实我一直模模糊糊不太理解,这种模模糊糊的感觉表述起来是这样: 在使用web服务时(功能接口),本来我就可以通过安卓中固有的http类(使用http协议),来发送http请求,并且 ...
- maven 结合mybaits整合框架,打包时mapper.xml文件,mapper目录打不进war包去问题
首先,来看下MAVENx项目标准的目录结构: 一般情况下,我们用到的资源文件(各种xml,properites,xsd文件等)都放在src/main/resources下面,利用maven打包时,ma ...
- 去哪网实习总结:JavaWeb中文传參乱码问题的解决(JavaWeb)
本来是以做数据挖掘的目的进去哪网的.结构却成了系统开发... 只是还是比較认真的做了三个月.老师非常认同我的工作态度和成果... 实习立即就要结束了,总结一下几点之前没有注意过的变成习惯和问题,分享给 ...
- 去哪网实习总结:用到的easyui组件总结(JavaWeb)
本来是以做数据挖掘的目的进去哪网的,结构却成了系统开发... 只是还是比較认真的做了三个月,老师非常认同我的工作态度和成果.. . 实习立即就要结束了,总结一下几点之前没有注意过的变成习惯和问题,分享 ...
随机推荐
- 操作系统下spinlock锁解析、模拟及损耗分析
关于spinlock 我们在知道什么是spinlock之前,还需要知道为什么需要这个spinlock?spinlock本质就是锁,提到锁,我们就回到了多线程编程的混沌初期,为了实现多线程编程,操作系统 ...
- SQL/T-SQL实例参考-2
对多关联查询,查询多中的记录,但是返回一的结果集 子查询语法 --一对多关联查询,查询多中的记录,但是返回一的结果集 SELECT C.* FROM ( SELECT A.BasicID FROM [ ...
- LogNet4
ASP.Net MVC 项目中添加LogNet4 1,创建ASP.NET MVC项目 2,NuGet或者直接下载log4net.dll 并安装 3 在配置文件 web.config 加入 如下代码 & ...
- Unite Shanghai 2019全日程曝光(建议收藏)
https://mp.weixin.qq.com/s/KvAyXpDhqWROtTX1Ol3a4Q 5月10-12日,Unite Shanghai 2019即将在上海国际会议中心正式开幕.本次大会共设 ...
- vim使用及vimrc配置
参考文章 https://segmentfault.com/a/1190000011466454 如有侵权,请联系本人删除!
- python 面向对象十一 super函数
python 面向对象十一 super函数 super函数用来解决钻石继承. 一.python的继承以及调用父类成员 父类: class Base(object): def __init__(se ...
- 【SSO单点系列】(5):CAS4.0 单点流程序列图
刚过元旦假期,感觉自己好久没写博客了,今天更新一篇,主要是CAS 的一个流程图. ps: 这两张图 是直接从官网上找的,都是简单的英语,我这种英语四级没过都看得懂,大家应该没有压力. 1.CAS 基本 ...
- JavaScript学习笔记——3.对象
JavaScript 对象 - 创建对象 1- var obj = new Object(); 2- var obj = {}; *例子:var person = {Name:"Hack&q ...
- 【python】10分钟教你用python一行代码搞点大新闻
准备 相信各位对python的语言简洁已经深有领会了.那么,今天就带大家一探究竟.看看一行python代码究竟能干些什么大新闻.赶紧抄起手中的家伙,跟我来试试吧. 首先你得先在命令行进入python. ...
- 条目六《当心C++编译器中最烦人的分析机制》
当心C++编译器中最烦人的分析机制 C++是较为底层的面相对象语言,在底层的语法规则分析中,有很多隐藏的分析机制. C++中的普遍规律相符,即尽可能地解释为函数声明. 把形式参数的声明用括号括起来是非 ...