`
tdq222
  • 浏览: 50952 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Android--XML文件解析(SAX)

阅读更多

Xml数据原型为:
	<?xml version="1.0" encoding="UTF-8"?>
	<persons>
		<person id="23">
			<name>李明</name>
			<age>30</age>
		</person>
		<person id="20">
			<name>李向梅</name>
			<age>25</age>
		</person>
	</persons>
--------------------------------------------------》
1. 编写XML解析类
	package cn.android.util;

	import java.util.ArrayList;
	import java.util.List;

	import org.xml.sax.Attributes;
	import org.xml.sax.SAXException;
	import org.xml.sax.helpers.DefaultHandler;

	import cn.android.domain.Person;

	/**
	 * 继承DefaultHandler类
	 * 用于解析XML文档的解析类
	 * @author Administrator
	 *
	 * 2010-6-28 下午07:51:20
	 */
	public class XmlParser extends DefaultHandler{

		//此处将XML里的数据封装成Person类,personList用于装解析后的数据
		private List<Person> personList = new ArrayList<Person>();
		//定义一个Person引用
		private Person person = null;
		//定义一个标记变量,标记当前的Xml文件被解析到哪个标签
		private String currentTag = null;
		
		/**
		 * 返回解析后的数据,是一个对象数组
		 * @return
		 */
		public List<Person> getObjectListFromXML() {
			return personList;
		}
		
		
		/**
		 * 解析XML时,当开始读到一个元素标签开始时,执行下面方法
		 */
		@Override
		public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
			//判断标签名是否为person,是的话创建一个Person对象,并将其id属性拿出来,赋值到person对象中
			if("person".equals(localName)) {
				person = new Person();
				Integer id = new Integer(attributes.getValue(0));
				person.setId(id);
			}
			//标记当前标签名
			currentTag = localName;
		}

		/**
		 * 解析XML时,当开始读到一个文本元素时,执行下面方法
		 */
		@Override
		public void characters(char[] ch, int start, int length) throws SAXException {
			
			//判断此文本元素是在一个 有效的标签体里面的     例:正确:<name>文本元素</name>  错误: 文本元素<name></name>
			
			if(currentTag != null) {
				//如果此文本元素为有效,则得到它的内容
				String value = new String(ch, start, length);
				
				//如果是在name标签里,则赋值给person的name属性
				if("name".endsWith(currentTag)) {
					person.setName(value);
				}
				
				//如果是在age标签里,则赋值给person的age属性
				if("age".endsWith(currentTag)) {
					person.setAge(new Short(value));
				}
			}
		}


		/**
		 * 解析XML时,当读到结束一个元素标签时,执行下面方法
		 */
		@Override
		public void endElement(String uri, String localName, String name) throws SAXException {
			
			//将当前标签名制空
			currentTag = null;
			
			//如果当前结束的标签名是person的话,代表一个person对象已经读取完毕。将其添加到list后制空
			if("person".endsWith(localName)) {
				personList.add(person);
				person = null;
			}
		}
			
		
	}

---------------------------------------------------------------------------------------------------------------------》
2。测试类:
	package cn.android.xml;

	import java.io.InputStream;

	import javax.xml.parsers.SAXParser;
	import javax.xml.parsers.SAXParserFactory;

	import android.test.AndroidTestCase;
	import android.util.Log;
	import cn.android.domain.Person;
	import cn.android.util.XmlParser;

	public class TestSAX extends AndroidTestCase {

		public void testParse() throws Throwable {
			try {
				//得到SAX解析工厂
				SAXParserFactory spf = SAXParserFactory.newInstance();
				
				// 设置解析器的相关特性,http://xml.org/sax/features/namespaces = true 表示开启命名空间特性
				// saxParser.setProperty("http://xml.org/sax/features/namespaces",true);
				SAXParser saxParser = spf.newSAXParser(); // 创建解析器
				
				
				//得到SAX解析实现类
				XmlParser handler = new XmlParser();
				//将xml文件以输入流的形式读入到内存中。
				InputStream inStream = XmlParseActivity.class.getClassLoader().getResourceAsStream("person.xml");
				
				//开始解析
				saxParser.parse(inStream, handler);
				
				//关闭输入留
				inStream.close();
				
				//将得到的每个对象信息写入到日志中
				for(Person person : handler.getObjectListFromXML()) {
					Log.i("XmlParseActivity", person.toString());
				}
			} catch (Exception e) {
				
				e.printStackTrace();
			}
		}

	}


注:域对象Person类:
	
	package cn.android.domain;

	public class Person {

	private Integer id;
	private String name;
	private	Short 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 + "---" + name + "---" + age;
	}
}



分享到:
评论
1 楼 soliucheng 2011-09-08  
师兄。这里你是把别人的拿过来的吧。
还需要加上权限条件。

  <uses-library android:name="android.test.runner" />
      <instrumentation android:name="android.test.InstrumentationTestRunner"
  android:targetPackage="Activity 包" android:label="Tests for My App" />

相关推荐

Global site tag (gtag.js) - Google Analytics