一、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文档的结束
(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循环判断当前操作事件类型是否为文档结束,是则跳出循环。
(4)while循环中通过switch语句判断当前事件类型是否为开始标签,是则获取该标签的内容。
四、案例
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>2.在activity_main中添加一个按钮,并注册单击事件
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; } }5.编写MainActivity代码
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.运行程序