博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
抱歉最近朋友结婚去浪了几天~未来几天会正常更新.今天带来XML文件解析
阅读量:4588 次
发布时间:2019-06-09

本文共 5437 字,大约阅读时间需要 18 分钟。

三种解析方法 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:

安阳
-8℃
120
北京
-12℃
500
上海
2℃
60

 

定义一个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
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
(); } 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 

 

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

转载于:https://www.cnblogs.com/AceIsSunshineRain/p/5170317.html

你可能感兴趣的文章
SQL---规则篇
查看>>
[洛谷 P5053] [COCI2017-2018#7] Clickbait
查看>>
poj 2388 Who&#39;s in the Middle
查看>>
PHP计算中文字符串长度 、截取相应中文字符串
查看>>
程序的模块化的一些见解6-读牛人代码之感
查看>>
ZigZag Conversion
查看>>
关注关注工作行列
查看>>
GDB十分钟教程
查看>>
MyEclipse导入jquery-1.8.0.min.js等文件报错的解决方案
查看>>
<pythonchallenge.com>----Lv1
查看>>
【新手入门篇】新浪微博应用开发之Java入门篇
查看>>
2-10
查看>>
CentOS 7 安装 Docker
查看>>
三、MapReduce学习
查看>>
MySQL的表分区详解 - 查看分区数据量,查看全库数据量----转http://blog.csdn.net/xj626852095/article/details/51245844...
查看>>
课程作业02将所有动手动脑的问题以及课后实验问题
查看>>
oracle_(第二课)监听器配置
查看>>
使用xdebug调试程序后程序很慢的原因
查看>>
windows下配置Tomcat7.0.22
查看>>
Perl中命令行参数以及打开管道文件
查看>>