Android--解析xml

一、Sax解析:

package com.xml.demo;

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

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

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

public class SAXParserXML {

	public List<Person> getPersons(InputStream inStream) throws Throwable {
		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser saxParser = factory.newSAXParser();
		MyHandler myHandler = new MyHandler();
		saxParser.parse(inStream, myHandler);
		List<Person> persons = myHandler.getPersons();
		inStream.close();
		return persons;
	}

	private final class MyHandler extends DefaultHandler {

		private List<Person> persons;
		private Person person;
		private String tagElement;

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

		@Override
		public void startDocument() throws SAXException {
			persons = 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.setId(new Integer(attributes.getValue(0)));
			}
			tagElement = localName;
		}

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

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

<?xml version="1.0" encoding="UTF-8"?>
<persons>
	<person id="001">
		<name>张一</name>
		<age>11</age>
	</person>
	<person id="002">
		<name>张二</name>
		<age>12</age>
	</person>
	<person id="003">
		<name>张三</name>
		<age>13</age>
	</person>
	<person id="004">
		<name>张四</name>
		<age>14</age>
	</person>
	<person id="005">
		<name>张五</name>
		<age>15</age>
	</person>
</persons>

package com.xml.demo;

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

import android.test.AndroidTestCase;
import android.util.Log;

public class XMLTest extends AndroidTestCase {
	
	/**
	 * 测试sax解析业务类
	 * @throws Throwable
	 */
	public void testSax() throws Throwable {
		SAXParserXML mSaxParserXML = new SAXParserXML();
		InputStream inStream = this.getClass().getClassLoader().getResourceAsStream("persons.xml");
		List<Person> persons = mSaxParserXML.getPersons(inStream);
		for(Person person : persons){
			Log.d(AppConstant.TAG, person.toString());
		}
	}
}

二、Pull解析

package com.xml.demo;

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

import org.xmlpull.v1.XmlPullParser;

import android.util.Xml;

public class PULLParserXML {

	private static final String ENCODING = "UTF-8";

	public List<Person> getPersons(InputStream inStream) throws Throwable {

		List<Person> persons = null;
		Person person = null;

		XmlPullParser pullParser = Xml.newPullParser();
		pullParser.setInput(inStream, ENCODING);

		// 产生第一个事件
		int eventType = pullParser.getEventType();

		while (eventType != XmlPullParser.END_DOCUMENT) {
			switch (eventType) {
			case XmlPullParser.START_DOCUMENT:
				persons = new ArrayList<Person>();
				break;
			case XmlPullParser.START_TAG:
				String tagName = pullParser.getName();
				if ("person".equals(tagName)) {
					person = new Person();
					person.setId(Integer.valueOf(pullParser.getAttributeValue(0)));
				}
				if (person != null) {
					if("name".equals(tagName)) {
						// 获取解析器当前指向元素的下一个文本节点的值
						person.setName(pullParser.nextText());
					}
					if ("age".equals(tagName)){
						person.setAge(Integer.valueOf(pullParser.nextText()));
					}
				}
				break;
			case XmlPullParser.END_TAG:
				if ("person".equals(pullParser.getName())) {
					persons.add(person);
					person = null;
				}
				break;
			}

			// 继续产生事件
			eventType = pullParser.next();
		}
		return persons;
	}
}

/**
	 * 测试Pull解析业务类
	 * @throws Throwable
	 */
	public void testPull() throws Throwable {
		PULLParserXML pull = new PULLParserXML();
		InputStream inStream = this.getClass().getClassLoader().getResourceAsStream("persons.xml");
		List<Person> persons = pull.getPersons(inStream);
		for(Person person : persons){
			Log.d(AppConstant.TAG, person.toString());
		}
	}

三、DOM解析

Android中不推荐使用DOM来解析xml,在此就不贴代码了。


你可能感兴趣的:(Android--解析xml)