什么是pull解析
——- pull解析xml文件,和sax和dom一样 都可以脱离android单独使用,pull和sax的原理一样,不一样的地方是pull读取xml文件后调用方法返回的是数字
- xml的声明返回数字0: START_DOCUMENT
- xml的结束返回数字1: END_DOCUMENT
- xml的开始标签返回数字2: START_TAG
- xml的结束标签返回数字3: END_TAG
-
xml的文本返回数字4: TEXT
说明了pull每个标识都是事件,它采用的就是事件驱动
直接上代码 :
对下面这个xml进行pull解析
<?xml version="1.0" encoding="utf-8"?>
<PlayList>
<media id = "0" day = "00">
<type>0</type>
<name>江南</name>
<path>E:\dotnet\TestWinApp\TestWinApp\music\江南.mp3</path>
</media>
<media id = "1" day = "11">
<type>1</type>
<name>新不了情-015</name>
<path>F:\电视剧\新不了情\新不了情-015.rmvb</path>
</media>
<media id = "2" day = "22">
<type>2</type>
<name>新不了情-016</name>
<path>F:\电视剧\新不了情\新不了情-016.rmvb</path>
</media>
</PlayList>
可以看到,我们对javaBean来进行储存
先创建一个play.java对象
public class Play {
private int id;
private int day;
private String name;
private int type;
private String path;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
@Override
public String toString() {
return "Play{" +
"id=" + id +
", day=" + day +
", name='" + name + '\'' +
", type=" + type +
", path='" + path + '\'' +
'}';
} //重写toString 是为了打印验证的
}
解析步骤:
1. 创建pull工厂类
2. 通过工厂类,创建pull解析器
3. 设置xml文件来源,也可以设置编码
4. 进行事件一个一个分析
5. 在分析的过程中,进行对bean对象创建
6. 打印验证
private static void xmlPullParserDemo() {
List<Play> list = null;
try {
//创建pull工厂类 并 创建解析器,链式编程
XmlPullParser pullParser = XmlPullParserFactory.newInstance().newPullParser();
//设置文件来源,也可以设置编码
pullParser.setInput(new FileReader("E:\\CodeDemo\\HttpUrlConnection\\paly.xml"));
int type = pullParser.getEventType();
Play p = null;
//进行事件一个一个分析
while (type != XmlPullParser.END_DOCUMENT) {
String nodeName = pullParser.getName();
switch (type) {
case XmlPullParser.START_DOCUMENT:
list = new ArrayList<>();
break;
case XmlPullParser.START_TAG:
{
switch (nodeName) {
case "media":
p = new Play();
int count = pullParser.getAttributeCount();
for (int i = ; i < count; i++) {
String name = pullParser.getAttributeName(i);
String value = pullParser.getAttributeValue(i);
if(name.equals("id")) {
p.setId(Integer.parseInt(value));
} else {
p.setDay(Integer.parseInt(value));
}
}
break;
case "type":
p.setType(Integer.parseInt(pullParser.nextText()));
break;
case "name":
p.setName(pullParser.nextText());
break;
case "path":
p.setPath(pullParser.nextText());
break;
}
} break;
case XmlPullParser.END_TAG:
if (nodeName.equals("media")) {
list.add(p);
}
break;
}
//在分析的过程中,进行对bean对象创建
type = pullParser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
for (int i = ; i < list.size(); i++) {
System.out.println(list.get(i));
//打印验证
}
}
注意:
1. int type = pullParser.getEventType(); 这个是获得事件类型,要不停的后移,别忘记 type = pullParser.next();
2. String nodeName = pullParser.getName(); 是获取节点名,仅仅是获取名,不是值
3. 这个是pullParser.nextText()获取值的,而不是getText();
4. 最后一个,别忘记了,文章开始的那几个tag, 0,1,2是做什么的