Android中使用SAX对XMl文件进行解析

     在android中的xml的文件解析,一般有三种方法 sax,dom,pull; 不过一般使用最多的是sax技术;在Java中使用SAX技术解析XML文档

     sax解析技术是解析速度很快,并且占用很小量的内存;sax解析的方法是进行事件驱动的方法,相对于dom技术必须要调用这个xml文档到内存中,他不需要整个xml文档,

    按顺序进行解析,按要求把xml当如到内存中;当我们在解析的时候,会按照要求触发一系列的回调方法,这些方法我们可以在ContentHandler接口中找到,不过如果实现这个接口,我们要去实现里面所有的方法,方法比较多;不过我们可以去继承已经实现该接口的DefaultHandler类;
     可以重写一下一些方法:

1:  startDocument()  这是解析到文档开始的时候,可以去做一些初始化或者预处理的事情

2:endDocument()  这是解析到文档结束的时候,可以去做一些收尾的事情

3:startElement(StringnamespaceURI, StringlocalName, StringqName, Attributesatts

    这是读到一个元素的时候,会触发这个方法  参数意思:

namespaceURI 命名空间,如果没有命名空间填写"";  localName:当前解析到的元素名字; qName:命名空间+当前解析到的元素名字;atts:当前解析到元素的属性

4:endElement(Stringuri, StringlocalName, String name)

这个方法和

startElement

方法相对应,在遇到结束标签的时候,调用.

5:characters(char[]ch,int start,int length)   调用这个方法,取出解析到的文本内容

  

  使用步骤:(使用以下的XML文件)

<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id="1">
<name>张三</name>
<age>30</age>
</student>
<student id="2">
<name>李四</name>
<age>24</age>
</student>
</students>

  1:创建继承于DefaultHandler解析帮组类;

  2:在创建读取方法里面进行SAX解析:

    SAXParserFactory spf = SAXParserFactory.newInstance();
   SAXParser parser = spf.newSAXParser();
   SAXXMLHandler handler = new SAXXMLHandler();
   parser.parse(inputStream, handler);

  

下面直接看Demo代码:

  解析帮助类:

  

package com.jiangqq.sax;

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 com.jiangqq.bean.Person;
import com.jiangqq.bean.Student;

public class SAXXMLHandler extends DefaultHandler {

	private Student student;
	private List<Student> list;
	private String tag;

	public List<Student> getList() {
		return list;
	}

	@Override
	public void startDocument() throws SAXException {

		super.startDocument();
		list = new ArrayList<Student>();
	}

	@Override
	public void endDocument() throws SAXException {
		super.endDocument();
	}

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		super.startElement(uri, localName, qName, attributes);
		if ("student".equals(localName)) {
			student = new Student();
			student.setId(new Integer(attributes.getValue("", "id")));
		}
		tag = localName;
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		super.endElement(uri, localName, qName);
		if (student != null && localName.equals("student")) {
			list.add(student);
			student = null;

		}
		tag = null;
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		super.characters(ch, start, length);
		if ("name".equals(tag)) {
			if (student != null) {
				student.setName(new String(ch, start, length));
			}
		} else if ("age".equals(tag)) {
			if (student != null) {
				student.setAge(new Short(new String(ch, start, length)));
			}
		}
	}
}

主Activity类

  

package com.jiangqq.activity;

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

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

import com.jiangqq.bean.Person;
import com.jiangqq.bean.Student;
import com.jiangqq.sax.R;
import com.jiangqq.sax.SAXXMLHandler;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class XmlMainActivity extends Activity {
	private Button saxbtn;
	private TextView tv;
	private List<Student> students;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		saxbtn = (Button) findViewById(R.id.et1);
		tv = (TextView) findViewById(R.id.tv);
		saxbtn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				InputStream inputStream = XmlMainActivity.class
						.getClassLoader().getResourceAsStream("student.xml");
				students = readSAXXML(inputStream);
				String string = "使用SAX解析结果如下:" + "\n";
				for (Student student : students) {
					string += student.toString();
					string += "\n";
				}
				tv.setText(string);
			}
		});
	}

	public List<Student> readSAXXML(InputStream inputStream) {
		try {

			SAXParserFactory spf = SAXParserFactory.newInstance();
			SAXParser parser = spf.newSAXParser();
			SAXXMLHandler handler = new SAXXMLHandler();
			parser.parse(inputStream, handler);
			inputStream.close();
			return handler.getList();
		} catch (Exception e) {
			Toast.makeText(this, "使用SAX进行XML文件解析失败", Toast.LENGTH_LONG).show();
		}
		return null;
	}
}

解析效果截图:

 

Demo下载链接:http://download.csdn.net/detail/jiangqq781931404/4018127

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值