android中Xml解析之Pull解析

一、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循环判断当前操作事件类型是否为文档结束,是则跳出循环。
 (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.运行程序

猜你喜欢

转载自blog.csdn.net/xmj_0422/article/details/78633373