Pull解析器によるxmlファイルの解析

2297 ワード

SAXとDOMでXMLファイルを解析できるほか、Android内蔵のPull解析器でXMLファイルを解析することもできます.
Pull解析器の動作はSAX解析器と似ています.開始要素と終了要素イベント、parserを使用するなど、類似のイベントを提供します.next()は、次の要素に入り、対応するイベントをトリガーできます.イベントは数値コードとして送信されるので,興味のあるイベントを1つのswitchで処理することができる.要素が解析を開始するとparserが呼び出される.nextText()メソッドは、次のTextタイプ要素の値を取得できます.
Pull解析器のソースコードとドキュメントのダウンロードサイト:http://www.xmlpull.org/
 
person.xmlファイル:
<?xml version="1.0" encoding="utf-8"?>
<persons>
    <person id="21">
        <name>hanmeimei</name>
        <age>23</age>
    </person>
    <person id="27">
        <name>lilei</name>
        <age>25</age>
    </person>
</persons>

Pull解析でxmlファイルコードを解析します.
/**
 *   Pull      xml  
 */
public class PullPersonService {

	public static List<Person> getPersons(InputStream inStream)
			throws Exception {
		List<Person> persons = null;
		Person person = null;

		//   XmlPullParser
		XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
		XmlPullParser parser = factory.newPullParser();

		//       XmlPullParser   
		// XmlPullParser parser = Xml.newPullParser()

		//     InputStream
		parser.setInput(inStream, "UTF-8");

		//           
		int event = parser.getEventType();

		//   while     xml  ,    
		while (event != XmlPullParser.END_DOCUMENT) {
			switch (event) {
			case XmlPullParser.START_DOCUMENT:
				persons = new ArrayList<Person>();
				break;
			case XmlPullParser.START_TAG:
				if ("person".equals(parser.getName())) {
					person = new Person();
					person.setId(new Integer(parser.getAttributeValue(0)));
				}

				if (person != null) {
					if ("name".equals(parser.getName())) {
						person.setName(parser.nextText());
					} else if ("age".equals(parser.getName())) {
						person.setAge(new Short(parser.nextText()));
					}
				}
				break;
			case XmlPullParser.END_TAG:
				if ("person".equals(parser.getName())) {
					if (person != null) {
						persons.add(person);
						person = null;
					}
				}
				break;
			case XmlPullParser.END_DOCUMENT:
				break;
			}
			event = parser.next();
		}

		return persons;
	}
}