Android_XML文件解析

        android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式,今天学习了Android—XML文件解析三种方法中的一种较常用的SAX,它不能向文件中添加内容。

 这种方式解析是一种基于事件驱动的api,有两个部分,解析器和事件处理器,解析器就是XMLReader接口,负责读取XML文档,和向事件处理器发送事件(也是事件源),事件处理器ContentHandler接口,负责对发送的事件响应和进行XML文档处理。

public abstract void characters (char[] ch, int start, int length)

      这个方法来接收字符块通知,解析器通过这个方法来报告字符数据块,解析器为了提高解析效率把读到的所有字符串放到一个字符数组(ch)中,作为参数传递给character的方法中,如果想获取本次事件中读取到的字符数据,需要使用start和length属性。

    public abstract void startDocument () 接收文档开始的通知

     public abstract void endDocument () 接收文档结束的通知

    public abstract void startElement (String uri, String localName, String qName, Attributes atts) 接收文档开始的标签

    public abstract void endElement (String uri, String localName, String qName) 接收文档结束的标签

    在一般使用中为了简化开发,在org.xml.sax.helpers提供了一个DefaultHandler类,它实现了ContentHandler的方法,我们只想继承DefaultHandler方法即可。(适配器模式)

   另外SAX解析器提供了一个工厂类:SAXParserFactory,SAX的解析类为SAXParser 可以调用它的parser方法进行解析。

小项目:

实体类

package com.szy.xml.model;
/**
 * @author  coolszy
 * @blog    http://blog.csdn.net/coolszy
 */
public class Person
{
	private Integer id;
	private String name;
	private Short age;
	
	public Person()
	{
		super();
	}
	
	public Person(Integer id, String name, Short age)
	{
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}

	public Integer getId()
	{
		return id;
	}

	public void setId(Integer id)
	{
		this.id = id;
	}

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}

	public Short getAge()
	{
		return age;
	}

	public void setAge(Short age)
	{
		this.age = age;
	}

	@Override
	public String toString()
	{
		return "id=" + getId() + ",name=" + getName() + ",age=" + getAge();
	}
}

继承defaulthandler

package com.szy.xml.handler;

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.szy.xml.model.Person;

/**
 * @author  coolszy
 * @blog    http://blog.csdn.net/coolszy
 */
public class XMLContentHandler extends DefaultHandler
{
	private static final String TAG = "XMLContentHandler";
	private List<Person> persons;
	private Person person;
	private String preTag;
	
	public List<Person> getPersons()
	{
		return persons;
	}
	
	@Override
	public void startDocument() throws SAXException
	{
		persons = new ArrayList<Person>();
		Log.i(TAG, "开始解析...");
	}
	
	/**
	 * uri:命名空间
	 * localName:不带命名空间前缀的标签名
	 * qName:带命名空间前缀的标签名
	 * attributes:属性集合
	 */
	@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("id")));
		}
		preTag = localName;
		Log.i(TAG, "解析元素:"+localName);
	}
	
	/**
	 * ch[]:内容
	 * start:其实位置
	 * length:长度
	 */
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException
	{
		if (person!=null)
		{
			String data = new String(ch, start,length);
			if ("name".equals(preTag))
			{
				person.setName(data);
			}
			else if ("age".equals(preTag))
			{
				person.setAge(new Short(data));
			}
		}
		Log.i(TAG, "解析内容:"+new String(ch, start,length));
	}

	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException
	{
		if ("person".equals(localName)&&person!=null)
		{
			persons.add(person);
			person = null;
		}
		preTag = null;
		Log.i(TAG, localName + "解析完毕");
	}

	
	@Override
	public void endDocument() throws SAXException
	{
		super.endDocument();
		Log.i(TAG, "文档解析完毕");
	}
}
解析 类

package com.szy.xml.service;

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

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

import com.szy.xml.handler.XMLContentHandler;
import com.szy.xml.model.Person;

/**
 * @author  coolszy
 * @blog    http://blog.csdn.net/coolszy
 */
public class SAXPersonService
{
	public static List<Person> readXml(InputStream inStream) throws Exception
	{
		SAXParserFactory spf=SAXParserFactory.newInstance();
		SAXParser saxParser=spf.newSAXParser();//创建解析器
		XMLContentHandler handler=new XMLContentHandler();
		saxParser.parse(inStream, handler);
		inStream.close();
		return handler.getPersons();
	}
}

解析文档

<?xml version="1.0" encoding="UTF-8"?>
<persons xmlns:pre="http://www.baidu.com">
	<pre:person id="001">
		<name>coolszy</name>
		<age>22</age>
	</pre:person>
	<pre:person id="002">
		<name>kuka</name>
		<age>22</age>
	</pre:person>
</persons>


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值