Android学习笔记(五)

本文介绍了一种使用SAX解析器处理XML文件的方法,并提供了一个具体的实现案例。该案例包括了定义XML文件结构、创建对应的Java实体类、实现SAX解析逻辑及在Android环境中进行测试的过程。

SAX解析XML文件

 

src下wp.xml

<?xml version="1.0" encoding="UTF-8"?>
<persons>
	<person id="23">
		<name>张三</name>
		<age>20</age>
	</person>
	<person id="20">
		<name>小明</name>
		<age>26</age>
	</person>
</persons>

 

org.wp.domain

Person

package org.wp.domain;

public class Person {

	private Integer id;
	private String name;
	private Short age;

	public Person() {

	}

	public Person(String name, Short age) {
		this.name = name;
		this.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 Short getAge() {
		return age;
	}

	public void setAge(Short age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Id=" + id + ",Name=" + name + ",Age=" + age;
	}
}

 

org.wp.service 

SAXPersonService

package org.wp.service;

import java.io.InputStream;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.wp.domain.Person;

public class SAXPersonService {

	public static List<Person> readXml(InputStream inStream) throws Exception {

		// 得到SAX解析器的工厂实例
		SAXParserFactory spf = SAXParserFactory.newInstance();

		// 从SAX工厂实例中获得SAX解析器
		SAXParser saxParser = spf.newSAXParser();

		// 设置解析器的相关特性,http://xml.org/sax/features/namespaces = true
		// 表示开启命名空间特性
		// saxParser.setProperty("http://xml.org/sax/features/namespaces",true);

		XMLContentHandler handler = new XMLContentHandler();
		saxParser.parse(inStream, handler);
		inStream.close();
		return handler.getPersons();
	}

} 

 

XMLContentHandler

package org.wp.service;

import java.util.ArrayList;
import java.util.List;
import org.wp.domain.Person;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class XMLContentHandler extends DefaultHandler {
	private List<Person> persons;
	private Person person;
	private String preTAG;

	@Override
	public void startDocument() throws SAXException {
		persons = new ArrayList<Person>();
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		if (person != null) {
			String data = new String(ch, start, length);
			if ("name".equals(preTAG)) {
				person.setName(data);
			} else if ("age".equals(preTAG)) {
				person.setAge(new Short(data));
			}
		}
	}

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		if ("person".equals(localName)) {
			person = new Person();
			person.setId(new Integer(attributes.getValue(0)));
		}
		preTAG = localName;
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		if ("person".equals(localName) && person != null) {
			persons.add(person);
			person = null;
		}
		preTAG = null;
	}

	public List<Person> getPersons() {
		return persons;
	}
}

 

org.wp.xml

SAXPersonServiceTest

package org.wp.xml;

import java.io.InputStream;
import java.util.List;
import org.wp.domain.Person;
import org.wp.service.SAXPersonService;
import android.test.AndroidTestCase;
import android.util.Log;

/**
 * Java中的getResourceAsStream有以下几种
 * 
 * 1. Class.getResourceAsStream(String path)
 * path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取
 * 其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源
 * 
 * 2. Class.getClassLoader.getResourceAsStream(String path)
 * 默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源
 * 
 * @author wp
 * 
 */

public class SAXPersonServiceTest extends AndroidTestCase {
	private static final String TAG = "SAXPersonServiceTest";

	public void testReadXml() throws Exception {
		InputStream inStream = SAXPersonServiceTest.class.getClassLoader()
				.getResourceAsStream("wp.xml");
		List<Person> persons = SAXPersonService.readXml(inStream);
		for (Person person : persons) {
			Log.i(TAG, person.toString());
		}
	}
}

 

XMLActivity

package org.wp.xml;

import java.io.InputStream;
import java.util.List;
import org.wp.domain.Person;
import org.wp.service.SAXPersonService;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

public class XMLActivity extends Activity {

	private static final String TAG = "XMLActivity";
	private TextView resultView;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		resultView = (TextView) findViewById(R.id.result);
		InputStream inStream = XMLActivity.class.getClassLoader()
				.getResourceAsStream("wp.xml");
		try {
			List<Person> persons = SAXPersonService.readXml(inStream);
			StringBuilder sb = new StringBuilder();
			for (Person person : persons) {
				sb.append(person.toString()).append("\n");
			}
			resultView.setText(sb.toString());
		} catch (Exception e) {
			Log.e(TAG, e.toString());
			Toast.makeText(this, "xml解析失败", 1).show();
		}
	}
}

 

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	>
	<TextView  
		android:layout_width="fill_parent" 
		android:layout_height="wrap_content" 
		android:id="@+id/result"
	/>
</LinearLayout>

 

strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
	<string name="hello">Hello World, XMLActivity!</string>
	<string name="app_name">xml解析器</string>
</resources>

 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="org.wp.xml" android:versionCode="1" android:versionName="1.0">
	<application android:icon="@drawable/icon" android:label="@string/app_name">
		<uses-library android:name="android.test.runner" />
		<activity android:name=".XMLActivity" android:label="@string/app_name">
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
		</activity>
	</application>
	<uses-sdk android:minSdkVersion="7" />
	<instrumentation android:name="android.test.InstrumentationTestRunner"
		android:targetPackage="org.wp.xml" android:label="Tests for My App" />
</manifest> 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值