Android演示解析xml文件-SAX

本文详细介绍了在Android环境下使用SAX方法解析XML文件的过程,包括提供测试xml文件、实体类定义、解析类实现及展示Activity的编写。重点突出SAX解析方式的特点与应用,特别适用于大文件读取场景。

Android下支持几种方式解析xml文件。其中SAX(Simple API for XML)由于解析速度快(文本形式解析)、占用内存少(不用将文件全部载入内存,行扫描)等优点,在需要对XML仅进行读操作、XML文件较大等情况下使用较多。本文将着重介绍SAX。


首先我们提供一个测试xml文件(摘自我们工作中抓取的服务器交互文件信息):

test.xml

<?xml version="1.0" encoding="UTF-8"?>
<LoginResp>
  <TimeStamp>20110519173529</TimeStamp>
  <UserToken>cc2d545418a32d46a6cd4376bc868bc3</UserToken>
  <ContentList>
    <Content>
      <ContentID>20000000000000000000000000097747</ContentID>
      <Sequence>363452190</Sequence>
      <Name>首页</Name>
    </Content>
    <Content>
      <ContentID>20000000000000000000000000097748</ContentID>
      <Sequence>363452192</Sequence>
      <Name>频道</Name>
    </Content>
    <Content>
      <ContentID>20000000000000000000000000067251</ContentID>
      <Sequence>363452193</Sequence>
      <Name>直播</Name>
    </Content>
    <Content>
      <ContentID>20000000000000000000000000097806</ContentID>
      <Sequence>363452195</Sequence>
      <Name>特色包</Name>
    </Content>
    <Content>
      <ContentID>20000000000000000000000000097750</ContentID>
      <Sequence>363452197</Sequence>
      <Name>搜索</Name>
    </Content>
  </ContentList>
  <ContentCount>5</ContentCount>
  <ResultCode>0</ResultCode>
  <ResultDesc>成功</ResultDesc>
</LoginResp>
使用adb push将文件push到手机内存中。


编写一个实体类:

Content.java

package com.freesoft.anttest;

public class Content {
	public static String ITEM = "Content";
	public static String CONTENTID_NAME = "ContentID";
	public static String SEQUENCE_NAME = "Sequence";
	
    private String ContentID;
	private int Sequence;
    
    public String getContentID() {
		return ContentID;
	}
	public void setContentID(String contentID) {
		ContentID = contentID;
	}
	public int getSequence() {
		return Sequence;
	}
	public void setSequence(int sequence) {
		Sequence = sequence;
	}
}

编写一个解析类:

SAXXmlHandler.java

注意需要重载几个重要事件方法:

  1. startDocument:开始读取文档内容时。用于初始化变量;
  2. startElement:开始读取节点时。用于增加节点变量、清空文本缓冲区;
  3. endElement:节点读取结束时。用于修改节点内容、将节点插入到队列中;

package com.freesoft.utility;

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.freesoft.anttest.Content;

public class SAXXmlHandler extends DefaultHandler {
	private static String TAG = "SAXXmlHandler";

	private List<Content> contents;
	private Content currentContent;
	private StringBuilder builder;

	public List<Content> getContents() {
		return contents;
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		super.characters(ch, start, length);

		// 读取字符串内容到缓冲区中
		builder.append(ch, start, length);
	}

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

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		super.endElement(uri, localName, qName);
		if (currentContent != null) {
			if (localName.equals(Content.CONTENTID_NAME)) {
				String strid = builder.toString();				
				currentContent.setContentID(strid);
			}
			else if (localName.equals(Content.SEQUENCE_NAME))
				currentContent.setSequence(IntWrapper.wrap(builder.toString(),
						0));
			else if (localName.equals(Content.ITEM))
				contents.add(currentContent);
			builder.setLength(0);
		}
	}

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

		contents = new ArrayList<Content>();
		builder = new StringBuilder();
	}

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		super.startElement(uri, localName, qName, attributes);
		if (localName.equals(Content.ITEM)) {
			currentContent = new Content();
		}
		builder.setLength(0);
	}

}

编写一个用来展现的Activity:

XmlSAXActivity.java

package com.freesoft.anttest;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;
import java.util.List;

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

import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

import com.freesoft.utility.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;

public class XmlSAXActivity extends Activity {
	private TextView tvView = null;
	private Button btnParse = null;
	private Button btnView = null;
	private SAXXmlHandler xmlhandle = null;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.xmlsax);

		getControls();
		initControls();
	}

	private void initControls() {
		btnParse.setOnClickListener(new BtnParse_onclick());
		btnView.setOnClickListener(new BtnView_onclick());
	}

	private void getControls() {
		tvView = (TextView) findViewById(R.id.tv_sax_view);
		btnParse = (Button) findViewById(R.id.btn_sax_parse);
		btnView = (Button) findViewById(R.id.btn_sax_view);
	}

	class BtnParse_onclick implements OnClickListener {
		@Override
		public void onClick(View arg0) {
			SAXParserFactory factory = SAXParserFactory.newInstance();
			SAXParser parser;
			try {
				parser = factory.newSAXParser();
				XMLReader xmlreader = parser.getXMLReader();
				URL url;
				InputSource is;
				url = new URL("file:///sdcard/welcome.xml");
				is = new InputSource(url.openStream());
				xmlhandle = new SAXXmlHandler();
				xmlreader.setContentHandler(xmlhandle);
				xmlreader.parse(is);
			} catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (ParserConfigurationException e) {
				e.printStackTrace();
			} catch (SAXException e) {
				e.printStackTrace();
			}
		}
	}
	
	class BtnView_onclick implements OnClickListener {
		@Override
		public void onClick(View arg0) {
			tvView.setText("");
			List<Content> contents = xmlhandle.getContents();
			Iterator i = contents.iterator();
			String outstr = "";
			while (i.hasNext()){
				Content content = (Content) i.next();
				String id = content.getContentID();
				int sequence = content.getSequence();
				outstr = outstr + "ContentID: " + id + "\n" + "Sequence: " +sequence + "\n";
			}
			tvView.setText(outstr);
		}
	}
}

这里需要注意:
  1. 首先得到一个SAXParserFactory的实例;
  2. 通过工厂创建一个parser对象;
  3. 通过parser对象得到一个XMLReader;
  4. 将xmlreader与新创建的xmlhandler关联起来,这样开始文件解析时相应事件会及时抛出;




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值