Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android開發系列(八):采用Pull解析器解析和生成XML內容

Android開發系列(八):采用Pull解析器解析和生成XML內容

編輯:關於Android編程

因為有些時候,應用的數據是采用XML文件的格式存放的,所以我們需要知道怎麼從XML文件中讀取這些數據

在Android中可以通過SAX、DOM、pull解析XML文件。

在本篇博文中主要介紹采用Pull解析器解析和生成XML內容。

介紹:在Android已經集成了Pull解析器,所以無需添加任何的jar文件。在Android中本身用到的各種xml文件,其內部也是采用Pull解析器進行解析的。


一、采用Pull解析器解析XML文件內容

首先,我們需要先建立一個Android Project項目,名稱為:xml。默認生成MainActivity.java,在cn.itcast.xml包下,這個java文件裡邊的內容是自動生成的。


然後,我們在src目錄下建立一個xml文件:person.xml:

 

	
		zhangsan
		30
	
	
		lisi
		25
	
可以看出來這個xml文件存了兩個person的信息。


接下來,我們需要建立一個javabean來反射這個xml文件,Person.java(注意這個bean中的屬性要和xml中的對應,不然不能正確解析):

package cn.itcast.domain;

public class Person {
	private Integer id;
	private String name;
	private Integer age;
	
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	
	
}
在這個java文件中我們定義了三個屬性:id、name、age,並生成了一個toString()的方法


在實體類建好之後,我們需要寫業務層的類了,PersonService.java:

package cn.itcast.service;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import cn.itcast.domain.*;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import android.util.Xml;

public class PersonService {
	
	public static List getPersons(InputStream xml) throws Exception{
		List persons = null;
		Person person  = null;
		//得到解析器
		/*這個方法和下邊功能相同,可以得到解析器:XmlPullParser pullParser = XmlPullParserFactory.newInstance().newPullParser();*/
		XmlPullParser pullParser = Xml.newPullParser();
		
		pullParser.setInput(xml,"UTF-8");//為Pull解析器設置要解析的XML數據
		int event = pullParser.getEventType(); //產生第一個事件:start document
		while(event != XmlPullParser.END_DOCUMENT){
			switch (event) { //對事件進行判斷
			case XmlPullParser.START_DOCUMENT:
				persons = new ArrayList();
				break;
			case XmlPullParser.START_TAG:
				if("person".equals(pullParser.getName())){
					int id = new Integer(pullParser.getAttributeValue(0));
					person = new Person();
					person.setId(id);
				}
				if("name".equals(pullParser.getName())){
					String name = pullParser.nextText();
					person.setName(name);
				}
				if("age".equals(pullParser.getName())){
					int age = new Integer(pullParser.nextText());
					person.setAge(age);
				}
				break;
			case XmlPullParser.END_TAG:
				if("person".equals(pullParser.getName())){
					persons.add(person);
					person = null;
				}
				break;
			}
			event = pullParser.next();	
		}
		return persons;
	}
}
這段代碼比較麻煩,我們接下來具體分析一下:

XmlPullParser pullParser = Xml.newPullParser();這段代碼是為了得到一個Pull解析器,另外:XmlPullParser pullParser = XmlPullParserFactory.newInstance().newPullParser();也可以得到Pull解析器。

pullParser.setInput(xml,"UTF-8");用來設置要解析的xml文件的編碼格式,這裡是“UTF-8”

因為Pull解析器是一個遍歷文檔的過程,所以要從這個start document事件開始,一直到結束。

int event = pullParser.getEventType();在這個時候,文檔被初始化,這裡會獲得文檔的start document,就是START_DOCUMENT事件。

然後,是一個while循環,限制條件是event != XmlPullParser.END_DOCUMENT,即當前遍歷的節點沒有達到結尾,就會執行while循環。

在while循環裡邊是一個switch()控制語句,用來控制當前選中的是哪個節點,裡邊有三個case:

case XmlPullParser.START_DOCUMENT:滿足START_DOCUMENT事件(就是xml文件的開頭)

case XmlPullParser.START_TAG:滿足START_TAG事件(就是xml元素節點的開頭:比如本篇中的

case XmlPullParser.END_TAG::滿足END_TAG事件(就是xml元素節點的結尾:比如本篇中的)

在第二個case中,我們做了三個判斷:

if("person".equals(pullParser.getName())):如果到達的是person元素節點,則把id賦給person

if("name".equals(pullParser.getName())):如果到達的是name元素節點,則把name賦給person

if("age".equals(pullParser.getName())):如果到達的是age元素節點,則把age賦給person


注意,在每一次switch()控制語句結束之後,會有一個event = pullParser.next(),這句話的意思是把Pull解析器指針指向下個節點。



以上,我們就把Pull解析器完成了,然後我們編寫一個測試類:

注意首先配置AndroidManfiest.xml引入測試的語法,這裡不多說了。

編寫PersonServiceTest.java,放在cn.itcast.test文件目錄下:

package cn.itcast.test;

import java.io.InputStream;
import java.util.List;

import cn.itcast.domain.Person;
import cn.itcast.service.PersonService;
import android.test.AndroidTestCase;
import android.util.Log;

public class PersonServiceTest  extends AndroidTestCase{
	private static final String TAG = "PersonServiceTest";
	public void testPersons() throws Exception{
		//通過getClassLoader()方法得到src目錄下person.xml文件的輸入流
		InputStream xml = this.getClass().getClassLoader().getResourceAsStream("person.xml");
		List persons = PersonService.getPersons(xml);
		for(Person person : persons){
			Log.i(TAG, person.toString());
		}
	}
}
然後,我們在LogCat頁面中添加一個過濾器:

\

就可以在LogCat頁面打印出來persons了。


<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPGgyPrb+oaKyydPDUHVsbL3izvbG98n6s8lYTUzE2sjdPC9oMj4KPHA+ztLDx9Kq1NpQZXJzb25TZXJ2aWNlLmphdmHW0Lao0uXSu7j2c2F2ZSgpt723qNPDwLTJ+rPJWE1MzsS8/qO6PC9wPgo8cD48cHJlIGNsYXNzPQ=="brush:java;">/** * 保存數據 * @param persons 數據 * @param out 輸出方向 * @throws Exception */ public static void save(List persons, OutputStream out) throws Exception{ XmlSerializer serializer = Xml.newSerializer(); //得到實例化器 serializer.setOutput(out, "UTF-8"); //設置輸出流編碼格式 serializer.startDocument("UTF-8", true);//設置START_DOCUMENT,就是xml的開頭 serializer.startTag(null, "persons"); //開始第一個persons標簽 for(Person person : persons){ serializer.startTag(null, "person"); serializer.attribute(null, "id", person.getId().toString()); serializer.startTag(null, "name"); serializer.text(person.getName()); serializer.endTag(null, "name"); serializer.startTag(null, "age"); serializer.text(person.getAge().toString()); serializer.endTag(null, "age"); serializer.endTag(null, "person"); } serializer.endTag(null, "persons"); serializer.endDocument(); out.flush(); out.close(); }然後,我們在測試類PersonServiceTest.java中加入一個方法:

public void testSave() throws Exception{
		List persons = new ArrayList();
		persons.add(new Person(43, "zhangxx",80));
		persons.add(new Person(24, "lisi",80));
		persons.add(new Person(12, "wangwu",80));
		//放在/files目錄下
		File xmlFile = new File(getContext().getFilesDir(),"itcast.xml");
		//打開輸出流
		FileOutputStream outStream = new FileOutputStream(xmlFile);
		PersonService.save(persons , outStream); //調用save()方法生成xml文件
	}
我們就可以在files文件目錄下生成一個itcast.xml文件了










  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved