三种解析方法 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文件解析的更多相关文章

  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. C# 筛选string 类型里面的汉字,获取首字母字母,正则表达式Regex 常用验证

    界面效果 1.提取汉字 private void buttonX1_Click(object sender, EventArgs e) { if (TxtYuan.Text.Trim() != &qu ...

  2. iOS wkwebview https 加载不受信用的站点

    iOS 9.0以上直接设置WKNavigationDelegate代理 func webView(_ webView: WKWebView, didReceive challenge: URLAuth ...

  3. this、static、main方法、静态代码块、final关键字、Runtime类、Cloneable类、类成员的访问控制权限、异常体系

    this表示当前对象,用在方法内部,当某对象调用该方法时,该方法中的this就代表调用该方法的对象: static关键字: 修饰类属性后,该属性就成为该类所有实例的公共属性,修改该属性值,所有的实例的 ...

  4. Multimap的初使用

    之前不知道这个类型使用,在朋友的推荐下进行了个实际操作. 类似这种查询,我需要将他们归类拿出来,如果招以前那么拿的话可能要套挺多个循环的. 首先根据查询得到一个 List<Map<Stri ...

  5. react.js学习之路四

    针对学习react.js中,我感觉最大的疑惑点就是bind(this)的绑定和指向问题了,我被这个问题弄的头昏,有时候调用组件的时候,直接显示undefined,不存在这个组件,当时的心情是崩溃的,整 ...

  6. ajax标准格式

    jquery向服务器发送一个ajax请求后,可以返回多种类型的数据格式,包括:html,xml,json,text等. $.ajax({    url:"http://www.test.co ...

  7. 老男孩Day11作业:selectors版socket

    一.作业需求: 使用SELECT或SELECTORS模块实现并发简单版FTP 允许多用户并发上传下载文件 二.readme 一.作业需求: 使用SELECT或SELECTORS模块实现并发简单版FTP ...

  8. C# 使用List<T> 内存溢出

    class Program    {        static void Main(string[] args)        {            var all = new List< ...

  9. HTTP原理 请求方法

    HTTP的工作过程 一次HTTP操作称为一个事务,其工作过程分为四步: 1.客户机与服务器建立连接:客户单击某个超级链接,HTTP的工作开始,接下来进行TCP连接的三次握手过程. 2.建立连接后,客户 ...

  10. rabbitmq生产者代码,以及过程参数含义:

    首先pom依赖: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="ht ...