在android中怎么使用pullparse解析.xml文件
Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parsernext()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parsernextText()方法可以获取下一个Text类型节点的值。
下面我们通过Demo例子来介绍如何使用PULL机制来解析XML文件。先看下如下工程的目录结构:
按以下步骤进行操作:
[1] 新建一个XML文件,命名为studentxml。同时把XML文件放置到assets目录下。studentxml文件的内容如下:
[html] view plaincopy
<xml version="10" encoding="utf-8">
<students>
<student id="20110806100">
<name>小明</name>
<age>22</age>
<sex>男</sex>
</student>
<student id="20110806101">
<name>小李</name>
<age>24</age>
<sex>男</sex>
</student>
<student id="20110806102">
<name>小丽</name>
<age>21</age>
<sex>女</sex>
</student>
</students>
[2] 根据XML文件中的节点目录,创建一个相对应的实体类,来保存解析的相应信息。在包:comandyideaentity下新建Studentjava类。
[html] view plaincopy
package comandyideaentity;
public class Student {
private String id;
private String name;
private int age;
private String sex;
public String getId() {
return id;
}
public void setId(String id) {
thisid = id;
}
public String getName() {
return name;
}
public void setName(String name) {
thisname = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
thisage = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
thissex = sex;
}
}
[3] 定义一个使用PULL解析XML文件的工具类:ParserByPULLjava。
[html] view plaincopy
package comandyideautil;
import javaioInputStream;
import javautilArrayList;
import javautilList;
import orgxmlpullv1XmlPullParser;
import orgxmlpullv1XmlPullParserFactory;
import androidutilXml;
import comandyideaentityStudent;
public class ParserByPULL {
//采用XmlPullParser来解析XML文件
public static List<Student> getStudents(InputStream inStream) throws Throwable
{
List<Student> students = null;
Student mStudent = null;
//========创建XmlPullParser,有两种方式=======
//方式一:使用工厂类XmlPullParserFactory
XmlPullParserFactory pullFactory = XmlPullParserFactorynewInstance();
XmlPullParser parser = pullFactorynewPullParser();
//方式二:使用Android提供的实用工具类androidutilXml
//XmlPullParser parser = XmlnewPullParser();
//解析文件输入流
parsersetInput(inStream, "UTF-8");
//产生第一个事件
int eventType = parsergetEventType();
//只要不是文档结束事件,就一直循环
while(eventType!=XmlPullParserEND_DOCUMENT)
{
switch (eventType)
{
//触发开始文档事件
case XmlPullParserSTART_DOCUMENT:
students = new ArrayList<Student>();
break;
//触发开始元素事件
case XmlPullParserSTART_TAG:
//获取解析器当前指向的元素的名称
String name = parsergetName();
if("student"equals(name))
{
//通过解析器获取id的元素值,并设置student的id
mStudent = new Student();
mStudentsetId(parsergetAttributeValue(0));
}
if(mStudent!=null)
{
if("name"equals(name))
{
//获取解析器当前指向元素的下一个文本节点的值
mStudentsetName(parsernextText());
}
if("age"equals(name))
{
//获取解析器当前指向元素的下一个文本节点的值
mStudentsetAge(new Short(parsernextText()));
}
if("sex"equals(name))
{
//获取解析器当前指向元素的下一个文本节点的值
mStudentsetSex(parsernextText());
}
}
break;
//触发结束元素事件
case XmlPullParserEND_TAG:
//
if("student"equals(parsergetName()))
{
studentsadd(mStudent);
mStudent = null;
}
break;
default:
break;
}
eventType = parsernext();
}
return students;
}
通过http协议与服务器建立链接。然后服务器返回一个String类型的xml字符串,android客户端把字符串解析成xml就ok具体例子请参考android学习手册。里面有源码。android学习手册包含9个章节,108个例子,源码文档随便看,例子都是可交互,可运行, 源码采用android studio目录结构,高亮显示代码,文档都采用文档结构图显示,可以快速定位。360手机助手中下载,图标上有贝壳。
将xml的信息读出来,比如天气预报,从网上获取的是xml文件,通过xml解析可以把天气状态读出来
例:
<forecast_date data="2009-07-31" />
<condition data="晴" />
<humidity data="湿度: 65%" />(xml文件不全)
可得到 2009-07-31 晴 湿度:65%
还有一作用是保存你的数据,比如做个旅游网站,你需要把全国各个省、城市名称写到xml文件,或者写成json进行保存,在程序中通过解析读取调用。
我用的是PULL解析,SAX,dom感觉都没PULL好用
public class XmlParseService
{
public static List<Person> pullXML(InputStream in)
{
try
{
//创建一个PULL解析对象
//1)XmlPullParser parse= XmlnewPullParser();
XmlPullParserFactory xmlfactory=XmlPullParserFactorynewInstance();
XmlPullParser parse=xmlfactorynewPullParser();
parsesetInput(in, "utf-8");
int eventCode=parsegetEventType();
Person person = null;
List<Person> list = null;
while(eventCode!=XmlPullParserEND_DOCUMENT)
{
switch(eventCode)
{
//开始解析文档
case XmlPullParserSTART_DOCUMENT:
list = new ArrayList<Person>();
Systemoutprintln("1111111开始文档的解析");
break;
case XmlPullParserSTART_TAG:
Systemoutprintln("2222222开始解析标记");
if("person"equals(parsegetName()))
{
person = new Person();
personsetId(parsegetAttributeValue(0));
}
else
{
if("name"equals(parsegetName()))
{
personsetName(parsenextText());
}
else if("age"equals(parsegetName()))
{
personsetAge(parsenextText());
}
}
break;
case XmlPullParserEND_TAG:
Systemoutprintln("33333333结束解析标记");
if("person"equals(parsegetName()))
{
if(person!=null)
{
listadd(person);
person = null;
}
}
break;
}
eventCode = parsenext();
}
inclose();
return list;
}
catch(Exception e)
{
eprintStackTrace();
}
return null;
}
你自己创建一个XML,我用实体类PERSON封装的
0条评论