Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 下用 Pull 解析和生成 XML

Android 下用 Pull 解析和生成 XML

編輯:關於Android編程

Java 中是可以用 SAX 和 DOM 解析 XML 的,雖然在 Android 下也可以用這2中方式,但是還是推薦用 Pull。Pull 使用簡單,效率相對高,Android 下是集成了 Pull ,所以並不需要用到第三方的包。

下面來舉例子,我要向 XML 文檔中讀寫學生信息,首先我定義一個學生類,包含ID、學號、姓名和年齡

public class Student {
	public Student() {};
	
	public Student(int id, int number, String name, int age) {
		this.id = id;
		this.number = number;
		this.name = name;
		this.age = age;
	}


	private int id;
	private int number;
	private String name;
	private int age;
	
	public int getId() {
		return id;
	}
	public int getNumber() {
		return number;
	}
	public String getName() {
		return name;
	}
	public int getAge() {
		return age;
	}
	public void setId(int id) {
		this.id = id;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	
	@Override
	public String toString() {
		return "Student [number=" + number + ", name=" + name + ", age=" + age
				+ "]";
	}
}

要讀取的 XML 文件裡面內容是這樣的



	
		33
		張三
		20
	
	
		29
		李四
		19
	

然後我寫了個 XmlHelper 類,有個靜態方法 getStudes,該方法接受輸入流,返回學生信息的集合

public static List getStudents(InputStream xml) throws Exception {
		List students = null;
		Student student = null;
		XmlPullParser parser = Xml.newPullParser(); //得到 Pull 解析器
		parser.setInput(xml, "UTF-8");	//設置輸入,編碼為 UTF-8
		
		int event = parser.getEventType(); //得到事件類型,每讀取到一個位置都有相對的事件類型
		while (XmlPullParser.END_DOCUMENT != event) {	//沒到文檔結尾就要循環讀取
			switch (event) {
			
			case XmlPullParser.START_DOCUMENT: //這是文檔開始事件,我們在這個地方做一些初始化工作
				students = new ArrayList();
				break;
				
			case XmlPullParser.START_TAG:	//標簽開始事件,標簽開始就是上面XML中的 、和 
				if (parser.getName().equals("student")) { //讀取到這個 student 標簽就說明下面就是我需要的信息了
					int id = Integer.valueOf(parser.getAttributeValue(0));
					student = new Student();
					student.setId(id);
				}
				if (null != student) { //避免出現空指針,先判斷一下再繼續
					if (parser.getName().equals("number")) {
						int number = Integer.valueOf(parser.nextText()); // nextText() 就是得到標簽後面的文本
						student.setNumber(number);
					}else if (parser.getName().equals("name")) {
						String name = parser.nextText();
						student.setName(name);
					}else if (parser.getName().equals("age")) {
						int age = Integer.valueOf(parser.nextText());
						student.setAge(age);
					}
				}
				break;
				
			case XmlPullParser.END_TAG:
				//讀取到  時說明一個學生的信息已經讀取完了
				if (parser.getName().equals("student")) {
					students.add(student);
					student = null;
				}
				break;
				
			default:
				break;
			}
			event = parser.next(); //一個讀取完了,就下一個,如此循環
		}
		return students;
	}


讀取就是這樣了,接下來寫怎樣生成。generate 方法,接受學生信息集合和輸出流
其實成成很好理解,就是按照順序一塊信息一塊信息寫下去

public static void generate(List students, OutputStream os) throws Exception {
		XmlSerializer serializer = Xml.newSerializer(); //得到序列化器
		serializer.setOutput(os, "UTF-8"); //設置輸出
		serializer.startDocument("UTF-8", true); //文檔開始了
		serializer.startTag(null, "students"); //標簽開始了
		for (Student student : students) {
			serializer.startTag(null, "student"); //子標簽開始了
			serializer.attribute(null, "id", String.valueOf(student.getId())); //指定該標簽屬性,這裡是ID
			
			//下面3個就是生成學號、姓名和年齡
			serializer.startTag(null, "number");
			serializer.text(String.valueOf(student.getNumber()));
			serializer.endTag(null, "number");
			
			serializer.startTag(null, "name");
			serializer.text(student.getName());
			serializer.endTag(null, "name");
			
			serializer.startTag(null, "age");
			serializer.text(String.valueOf(student.getAge()));
			serializer.endTag(null, "age");
			
			serializer.endTag(null, "student"); //子標簽結束
		}
		serializer.endTag(null, "students"); //標簽結束
		serializer.endDocument(); //文檔結束
		os.flush(); //如果傳入的輸出流不是文件,就就要刷新一下緩沖區
		os.close();
	}
}

然後咱來寫一個測試單元來測試一下這倆方法

public class XmlHelperTest extends AndroidTestCase {
	private static final String TAG = "XmlHelperTest";
	
	public void testGetStudents() throws Exception {
		InputStream xmlIstm = this.getClass().getClassLoader().getResourceAsStream("students.xml");
		List students = XmlHelper.getStudents(xmlIstm);
		for (Student student : students) {
			Log.i(TAG, student.toString());
		}
	}
	
	public void testGenerate() throws Exception {
		List students = new ArrayList();
		students.add(new Student(1, 13, "小建", 21));
		students.add(new Student(2, 16, "大康", 20));
		
		File xmlFile = new File(getContext().getFilesDir(), "students.xml");
		FileOutputStream fos = new FileOutputStream(xmlFile);
		try {
			XmlHelper.generate(students, fos);
			Log.i(TAG, "生成XML文件成功");
		} catch(Exception e) {
			Log.i(TAG, "生成XML文件失敗:" + e.getMessage());
		}
	}
}

-----------------------
樓主以前都是寫 C++ 的,也才學 Android 不久,加油吧。
好久沒寫博客了,感覺吧,還是應該堅持寫下去。

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