Android 解析XML文件 (SAX与PULL)

本文通过一个具体的例子,展示了如何使用SAX和PULL两种方式来解析XML文件,并将解析后的数据映射到Java对象中。文章提供了完整的代码实现,并在Android环境中进行了测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、首先创建一个需要解析的person.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<persons>
	<person id="20">
		<name>MacDroid</name>
		<age>22</age>
	</person>
	<person id="30">
		<name>Vect</name>
		<age>28</age>
	</person>
</persons>

二、创建Person.java用来对应解析出来的对象

public class Person {

	public int id;
	public String name;
	public int age;

	@Override
	public String toString() {
		return "id : " + id + " name : " + name + " age " + age;
	}
}

三、这一点是关键,解析刚才创建的person.xml文件

1)使用SAX解析方式

public class SAXParse {

	public List<Person> readXml(InputStream is)   {
		try {
			SAXParser mSAXParser = SAXParserFactory.newInstance()
					.newSAXParser();
			PersonHandler mPersonHandler = new PersonHandler();
			mSAXParser.parse(is, mPersonHandler);
			is.close();
			return mPersonHandler.getPersons();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	private final class PersonHandler extends DefaultHandler {

		private List<Person> list = null;
		private String tag = null;
		private Person person;

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

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

		}

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

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

		}

		public List<Person> getPersons() {
			return this.list;
		}

	}

}
(2)使用PULL解析方式

public class PullParse {

	private List<Person> list;
	public List<Person> getPersons(InputStream is) {
		XmlPullParser mXmlPullParser = Xml.newPullParser();
		Person person = null;
		try {
			mXmlPullParser.setInput(is, "UTF-8");
			// 产生第一个事件
			int eventType = mXmlPullParser.getEventType();
			while (eventType != XmlPullParser.END_DOCUMENT) {
				switch (eventType) {

					case XmlPullParser.START_DOCUMENT:
						list = new ArrayList<Person>();
						break;
					case XmlPullParser.START_TAG:
						// 得到解析器当前指向元素节点的便签名
						String name = mXmlPullParser.getName();
						if ("person".equals(name)) {
							person = new Person();
							person.id = Integer.parseInt(mXmlPullParser
									.getAttributeValue(0));
						} else if (person != null) {
							if ("name".equals(name)) {
								// 得到解析器当前指向元素节点的下一个文本节点
								person.name = mXmlPullParser.nextText();
							} else if ("age".equals(name)) {
								person.age = Integer.parseInt(mXmlPullParser
										.nextText());
							}
						}
						break;
					case XmlPullParser.END_TAG:
						if ("person".equals(mXmlPullParser.getName())) {
							list.add(person);
							person = null;
						}
						break;
				}
				eventType = mXmlPullParser.next();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}
}
最后自己的定义Activity中测试这两种解析方式

public class SAXParseDemoActivity extends Activity {
	/** Called when the activity is first created. */
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        try{
        	testSAXParse();
        	testPullParse();
        }catch(Exception e){
        	
        }
    }
	
	public void testSAXParse() throws IOException {  
		InputStream is =this.getAssets().open("person.xml"); 
		SAXParse mSaxParser = new SAXParse();  
		List<Person> list = mSaxParser.readXml(is);  
		Log.i("testSAXParse", "size = " + list.size());
		for(Person p : list)  
			System.out.println(p);  
	}  
	
	public void testPullParse() throws IOException{
		InputStream is =this.getAssets().open("person.xml"); 
		PullParse mPullParse = new PullParse();
		List<Person> list = mPullParse.getPersons(is);
		Log.i("testPullParse", "size = " + list.size());
		for(Person p : list)  
			System.out.println(p); 
	 } 
}

最后运行出来的结果:

I/System.out( 1943): id : 20 name : MacDroid age 22
I/System.out( 1943): id : 30 name : Vect age 28
I/testPullParse( 1943): size = 2
I/System.out( 1943): id : 20 name : MacDroid age 22
I/System.out( 1943): id : 30 name : Vect age 28



代码实现下载地址:http://download.youkuaiyun.com/my/uploads


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值