一、pull解析介绍
Pull解析是一个开源的Java项目,既可以用于Android应用,也可以用于JAVAEE程序。Android已经集成了PULL解析器,因此,在Android中最常用的解析方式就是PULL解析。
使用pull解析XML文档,首先要创建XmlPullParser解析器,该解析器提供了很多属性,通过这些属性可以解析出xml文件中的各个节点内容。
二、XmlPullParser的常用属性:
(1)XmlpullParser.START_DOCUMENT:XML文档的开始,如<?xml version="1.0" encoding="UTF-8"?>
(2)XmlpullParser.END_DOCUMENT:XML文档的结束
(3)XmlpullParser.START_TAG:开始节点,在XML文件中,除了文本之外,带有尖括号<>的都是开始节点,如<name>
(4)XmlpullParser.END_TAG:结束节点,带有</>都是结束节点,如</name>
三、接下来介绍Pull解析器 的用法,具体步骤如下
(1)通过调用Xml.newPullParser(); 得到一个XmlPullParser对象。
(2)通过parser.getEventType() 获取到当前事件的类型.
(3)通过While循环判断当前操作事件类型是否为文档结束,是则跳出循环。
四、案例
1.创建一个安卓项目,在src目录下创建一个person.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="1">
<name>abc</name>
<age>123</age>
</person>
<person id="2">
<name>cde</name>
<age>456</age>
</person>
</persons>
3.Person类,封装name,age,id 属性
package com.example.xmlpulltest;
public class Person {
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
4.创建PersonService工具类
package com.example.xmlpulltest;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import android.util.Log;
import android.util.Xml;
public class PersonService {
public static List<Person> getpersons(InputStream is) throws Exception{
XmlPullParser parser=Xml.newPullParser();//拿到pull解析器
//初始化解析器,第一个参数代表包含xml数据
parser.setInput(is,"utf-8");
List<Person> persons=null;
Person person1=null;
int type=parser.getEventType();//得到当前事件类型
while(type!=XmlPullParser.END_DOCUMENT){//文档结束标签
switch(type){
case XmlPullParser.START_TAG://一个节点的开始标签
if("persons".equals(parser.getName())){//解析到全局开始的标签 persons根节点
persons=new ArrayList<Person>();
//Log.i(" no problem","p1");
}
else if("person".equals(parser.getName())){
// Log.i(" no problem","p2");
person1 =new Person();//
String idStr=parser.getAttributeValue(0);//解析person标签里面的第一个id属性
person1.setId(Integer.parseInt(idStr));//将解析到的id 放在person1的id里面
}else if("name".equals(parser.getName())){
// Log.i(" no problem","p3");
String name=parser.nextText();//得到该节点的内容
person1.setName(name);//放在person1的name里面
}
else if("age".equals(parser.getName())){
String age=parser.nextText();
person1.setAge(age);
}
break;
case XmlPullParser.END_TAG://一个节点的结束标签
if("person".equals(parser.getName())){//一个person处理完毕,准备下一个节点
persons.add(person1);
person1=null;
}
break;
}
//只要不解析到文档末尾,就解析下一个条目。得到下一个节点的事件类型
//注意,这个千万不能少,否则成了死循环
type=parser.next();
}
return persons;
}
}
package com.example.xmlpulltest;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
String filename="personinfo";
String content;
FileOutputStream fos;
private Button button;
List<Map<String,String>> list;
Map<String,String> map;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button)findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
try{
//调用PersonService的解析方法,person。xml就在类的目录下。用类加载器来加载 getClassLoader().getResourceAsStream("person.xml")
List<Person>persons=PersonService.getpersons(MainActivity.this.getClassLoader().getResourceAsStream("person.xml"));
//Log.i(" no problem","1");
list=new ArrayList<Map<String,String>>();//创建一个list用来放Map对象
//循环读取persons 里面的数据
for(Person one_person:persons){
map=new HashMap<String,String>();//每一个循环都创建一个新的map,来存放person的数据
map.put("name",one_person.getName());
map.put("age",one_person.getAge());
list.add(map);//每一个map都放入list集合
}
//Log.i(" no problem","2");
fos=openFileOutput(filename,MODE_PRIVATE);//创建一个文件,用来检验是否解析了数据
for(int i=0;i<list.size();i++){//list中放了多少个map
map=new HashMap<String,String>();//每一次创建一个新的map用来存放从list中取出来的map,并将新创建的map数据取出来
map=list.get(i);//list 取数据按照从0开始,第一个map,第二个map....
String name=map.get("name");
String age=map.get("age");
fos.write(name.getBytes());//将解析出来name,age数据放到文件中
fos.write(age.getBytes());
}
//Log.i(" no problem","3");
fos.close();
}
catch(Exception e){
Log.i("失败了","");
e.printStackTrace();
}
}
});
}
}
6.运行程序