三种解析方法 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 { ListcityList; @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
虽然很基础 但我慢慢写 把知识分享给大家 自己也复习了 很好很棒 所以我会坚持的