抱歉最近朋友结婚去浪了几天~未来几天会正常更新.今天带来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" />
虽然很基础 但我慢慢写 把知识分享给大家 自己也复习了 很好很棒 所以我会坚持的