您的位置:首页 > 移动开发 > Android开发

Android之xml解析

2015-09-15 10:21 441 查看
xml解析分为三种方式:sax,dom,pull。

sax,pull内存占用少,更适合于Android手机开发;pull编程方式较其他两种较为简洁;dom可随意访问任何一个结点;sax,pull是解析同步的,dom是解析好后供用户提取感兴趣的信息。

sax解析:

package com.hnust.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 android.util.Log;

import com.hnust.pojo.Person;
/***
 * SAX解析的工具类
 * @author zzg
 *
 */
public class SAXForHandler extends DefaultHandler {

	private static final String TAG="SAXForHandler";
	private List<Person> persons;
	private String perTag;//通过此变量记录前一个标签的名称
	Person person;
	
	public List<Person> getPerson(){
		return persons;
	}
	//调用一次,适合一些初始化的动作
	@Override
	public void startDocument() throws SAXException{
		persons=new ArrayList<Person>();
		Log.i(TAG, "***startDoucemnt****");
	}
	/***
	 * 调用多次
	 * 
	 */
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		if("person".equals(localName)){
			for(int i=0;i<attributes.getLength();i++){
				Log.i(TAG,"attrName:"+attributes.getLocalName(i)+"_attrValue_:"+attributes.getValue(i));
				person=new Person();
				person.setId(Integer.valueOf(attributes.getValue(i)));
			}
		}
		perTag=localName;
		Log.i(TAG, qName+"***startElement****");
	}
	//调用多次
	/***
	 * @param ch[] 当前读取到的字节数组
	 * @param start 字节开始的位置
	 * @param length 当前TextNode的长度
	 */
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		// TODO Auto-generated method stub
		String data=new String(ch,start,length).trim();
		if(!"".equals(data.trim())){
			Log.i(TAG,"content:"+data.trim());
		}
		if("name".equals(perTag)){
			person.setName(data);
		}else if("age".equals(perTag)){
			person.setAge(Integer.parseInt(data));
		}
	}
	//调用多次
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		// TODO Auto-generated method stub
		Log.i(TAG, qName+"***endElement****");
		if("person".equals(localName)){
			persons.add(person);
			person=null;
		}
		perTag=null;//结束的时候必须为空
	}
	//调用一次
	@Override
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub
		Log.i(TAG, "***endDoucemnt****");
	}
	
}
package com.hnust.pojo;

public class Person {
	
	private int id;
	private String name;
	private int age;
	public Person(){};
	public Person(int id,String name,int age){
		this.id=id;
		this.age=age;
		this.name=name;
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "id="+id+",name="+name+",age="+age;
		
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}
AssetManager asset=getAssets();
			InputStream is=asset.open("person.xml");
			List<Person> persons=null;
			StringBuilder sb=new StringBuilder();
			switch(v.getId()){
			case R.id.sax_button:
				//sax解析xml文件
				SAXForHandler handler=new SAXForHandler();
				SAXParserFactory spf=SAXParserFactory.newInstance();
				SAXParser parser=spf.newSAXParser();
				parser.parse(is, handler);
				
				persons=handler.getPerson();
				for(Person person:persons){
					sb.append(person.toString());
				}
				Toast.makeText(this, sb,1).show();
				break;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: