XmlPullParser解析
1、XML对应的实体文件
2、XML文件
3、Pull解析码
android可以使用 SAX和DOM解析XML文件,也可以使用Android内置的Pull解析器解析XML文件。
下面将介绍下在Android中极力推荐的xmlpull方式解析xml。xmlpull不仅仅可以使用在Android上,同样也适用于javase,但在javase环境下,你需要自己去获取xmlpull所依赖的类库。
pull解析是事件驱动的所以根据数据的开始结束标记进行分析。
XML对应的实体文件:
public class StaInfo {
private int idx;
private String name;
private float longitude;
private float latitude;
@Override
public String toString() {
return "StaInfo{" +
"idx=" + idx +
", name='" + name + '\'' +
", longitude=" + longitude +
", latitude=" + latitude +
'}';
}
public int getIdx() {
return idx;
}
public void setIdx(int idx) {
this.idx = idx;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getLongitude() {
return longitude;
}
public void setLongitude(float longitude) {
this.longitude = longitude;
}
public float getLatitude() {
return latitude;
}
public void setLatitude(float latitude) {
this.latitude = latitude;
}
}
xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<Stations>
<lineName>5</lineName>
<staCount>26</staCount>
<StaInfo>
<idx>1</idx>
<name>站1</name>
<longitude>30</longitude>
<latitude>120</latitude>
</StaInfo>
<StaInfo>
<idx>2</idx>
<name>站2</name>
<longitude>30</longitude>
<latitude>120</latitude>
</StaInfo>
<StaInfo>
<idx>3</idx>
<name>站3</name>
<longitude>30</longitude>
<latitude>120</latitude>
</StaInfo>
</Stations>
pull解析码:
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
public class PullParser {
public void pull() throws Exception {
ArrayList<StaInfo> staInfos = null;//创建一个集合
StaInfo station =null;//station对象
//获得工厂
XmlPullParserFactory parserFactory = XmlPullParserFactory.newInstance();
//获得xml的解析器
XmlPullParser parser = parserFactory.newPullParser();
//给解析器设置一个输入源
parser.setInput(new FileInputStream(new File("5up.xml")), "UTF-8");
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_TAG:
//开始标签,parser获取当前事件对应的元素名字
if("Station".equals(parser.getName())){
staInfos =new ArrayList<>();
//创建一个Station集合
}else if("StaInfo".equals(parser.getName())){
station =new StaInfo();
//创建一个StaInfo对象
}else if("idx".equals(parser.getName())){
station.setIdx(Integer.parseInt(parser.nextText()));
//给StaInfo对象设置id
}else if("name".equals(parser.getName())){
station.setName(parser.nextText());
//给StaInfo对象设置name
}else if("longitude".equals(parser.getName())){
station.setLongitude(Float.parseFloat(parser.nextText()));
//给StaInfo对象设置longitude
}else if("latitude".equals(parser.getName())){
station.setLatitude(Float.parseFloat(parser.nextText()));
//给StaInfo对象设置latitude
}else if("subway".equals(parser.getName())){
//给StaInfo对象设置subway
}else if("transfer".equals(parser.getName())){
//给StaInfo对象设置transfer
}
break;
case XmlPullParser.END_TAG:
if("StaInfo".equals(parser.getName())){
staInfos.add(station);
break;
//把StaInfo对象放到集合中
}
break;
default:
break;
}
//调用parser.next()方法解析下一个元素
eventType = parser.next();
}
for (StaInfo staInfos1 : staInfos) {
System.out.println("pullparser=======" +staInfos1);
}
}
}