android xml 解析

android xml 解析

在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。

SAX特点: 解析方式是一种基于事件驱动的,消耗的内存少
  
Pull特点: 解析方式是一种基于事件驱动的,消耗的内存少,在android系统内部的xml解析都是用这种方式

Dom特点: dom是把全部文件读入到内存中,这种方式很消耗内存,对于内存资源本来就很少的android手机,这种 方式不太建议使用。

个人建议:  SAX和pull都比较适合mobile,Dom适合服务器解析,随着mobile手机的内存增加,Dom也许可以使用。

SAX解析例子:

XML:
<?xml version="1.0" encoding="utf-8"?>
<users>
<user name="admin0" age="26">root0</user>
<user name="admin1" age="26">root1</user>
<user name="admin2" age="26">root2</user>
<user name="admin3" age="26">root3</user>
</users>
放在src/目录下


SAXHandler:
package com.hualu.androidxml;

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

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

public class SAXHandler extends DefaultHandler {

	private List<User> users ;
	User user ;
	int i = 1 ;
	@Override
	public void startDocument() throws SAXException {
		users = new ArrayList<User>() ;
	}
	
	@Override
	public void endDocument() throws SAXException {
		super.endDocument();
	}
	
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		
		if("user".equals(localName)){
			i = 2 ;
			user = new User() ;
			user.setName(attributes.getValue("name")) ;
			user.setAge(attributes.getValue("age")) ;
		}
		
	}
	
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		if("user".equals(localName)){
			users.add(user) ;
		}
	}
	
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		if(i == 2)
			user.setPassword(String.valueOf(ch,start,length)) ;
		
		i = 1 ;
	}

	public List<User> getUsers() {
		return users ;
		
	}
	
}
SAXClient:
package com.hualu.androidxml;

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

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

import android.content.Context;

public class SAXClient {

	public void parserXML(Context context) {
		try {
			SAXParserFactory factory = SAXParserFactory.newInstance();
			SAXParser parser = factory.newSAXParser();
			SAXHandler handler = new SAXHandler() ;
			InputStream file = SAXClient.class.getClassLoader().getResourceAsStream("user.xml");
			parser.parse(file, handler) ;
			List<User> users = handler.getUsers() ;
			for(User user: users){
				System.out.println(user.getName() + " ; " + user.getPassword() + "  ;  " + user.getAge());
			}
		} catch (Exception e) {
		}

	}
}
具体步骤:

1、实例化一个工厂SAXParserFactory

2、实例化SAXPraser对象,创建XMLReader 解析器

3、实例化Handler,处理器

4、注册解析器

4、读取文件流

5、解析文件


Pull解析例子:

XML:
<?xml version="1.0" encoding="utf-8"?>
<users>
<user name="admin0" age="26">root0</user>
<user name="admin1" age="26">root1</user>
<user name="admin2" age="26">root2</user>
<user name="admin3" age="26">root3</user>
</users>
放在res/xml目录下。

PullXMLParser:
package com.hualu.androidxml;

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

import android.app.Activity;
import android.content.res.XmlResourceParser;

public class PullXMLParser {
	
	private Activity activity ;
	
	public PullXMLParser(Activity activity ){
		this.activity  = activity;
	}
	
	public List<User> parser(){
		List<User> users = new ArrayList<User>() ;
		XmlResourceParser xrParser = activity.getResources().getXml(R.xml.user);
		try{
			while(xrParser.getEventType() != XmlResourceParser.END_DOCUMENT) {
				if(xrParser.getEventType() == XmlResourceParser.START_TAG){
					String tagName = xrParser.getName() ;
					if("user".equals(tagName)){
						User user = new User() ;
						user.setName(xrParser.getAttributeValue(null, "name")) ;
						user.setAge(xrParser.getAttributeValue(null, "age")) ;
						user.setPassword(xrParser.getText()) ;
						users.add(user) ;
					}
				}
				xrParser.next() ;
			};
		}catch (Exception e) {
		}
		return users ;
	}

}
具体步骤:
1. 通过Resource,取得XML文件数据,实例化一个

XmlResourceParser

2. 通过

XmlResourceParser的事件判断,解析XmL


这种方式比SAX简单些(个人认为)。








原文地址:https://www.cnblogs.com/java20130722/p/3207263.html