Android开发偏下载Tomcat服务器的xml文件并使用SAX解析

Android开发之下载Tomcat服务器的xml文件并使用SAX解析

         解析 XML 通常有两种方式,DOM 和 SAX。DOM 虽然是 W3C 的标准,提供了标准的解析方式,但它的解析效率一直不尽如人意,因为使用DOM解析XML时,解析器读入整个文档并构建一个驻留内存的树结构(节点树),然后您的代码才可以使用 DOM 的标准接口来操作这个树结构。但大部分情况下我们只对文档的部分内容感兴趣,根本就不用先解析整个文档,并且从节点树的根节点来索引一些我们需要的数据也是非常耗时的。 
        SAX是一种XML解析的替代方法。相比于文档对象模型DOM,SAX 是读取和操作 XML 数据的更快速、更轻量的方法。SAX 允许您在读取文档时处理它,从而不必等待整个文档被存储之后才采取操作。它不涉及 DOM 所必需的开销和概念跳跃。 SAX API是一个基于事件的API ,适用于处理数据流,即随着数据的流动而依次处理数据。SAX API 
在其解析您的文档时发生一定事件的时候会通知您。

在Tomcat服务器上有一个xml文件如下,这个xml文件就是接下来要解析的文件

<?xml version="1.0" encoding="utf-8"?>
<workers>
	<worker id="AQ01">
		<name>Zhang</name>
		<sex>男</sex>
		<status>经理</status>
		<address>深圳</address>
		<money>4000</money>
	</worker>
	<worker id="AQ02">
		<name>Deng</name>
		<sex>男</sex>
		<status>员工</status>
		<address>广州</address>
		<money>2000</money>
	</worker>
	<worker id="AQ03">
		<name>Lili</name>
		<sex>女</sex>
		<status>员工</status>
		<address>北京</address>
		<money>4000</money>
	</worker>
</workers>

由于需要下载文件,所以要用到下载工具类和文件操作工具类,这两个工具类在http://blog.csdn.net/deng0zhaotai/article/details/11520717有介绍,不清楚的可以去参考下。

SAX API中主要有四种处理事件的接口,它们分别是ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler;实际上DefaultHandler就是实现了上面的四个事件处理器接口,然后提供了每个抽象方法的默认实现;所以我们只要继承DefaultHandler就行了,然后覆盖我们感兴趣的方法进行处理。

package com.example.xml;

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

public class MyContentHandler extends DefaultHandler {
	String hisname, address, money, sex, status;
	String tagName;

	/**
	 * 开始解析xml文件
	 */
	public void startDocument() throws SAXException {
		System.out.println("````````begin````````");
	}

	/**
	 * 解析xml文件结束
	 */
	public void endDocument() throws SAXException {
		System.out.println("````````end````````");
	}

	/**
	 * 开始解析标签
	 */
	public void startElement(String namespaceURI, String localName,
			String qName, Attributes attr) throws SAXException {
		tagName = localName;
		if (localName.equals("worker")) {
			//获取标签的全部属性
			for (int i = 0; i < attr.getLength(); i++) {
				System.out.println("startElement " + attr.getLocalName(i) + "=" + attr.getValue(i));
			}
		}
	}

	/**
	 * 解析标签结束
	 */
	public void endElement(String namespaceURI, String localName, String qName)
			throws SAXException {
		//在workr标签解析完之后,会打印出所有得到的数据
		tagName = "";
		if (localName.equals("worker")) {
			this.printout();
		}
	}
	
	/**
	 * 读取到内容
	 */
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		if (tagName.equals("name"))
			hisname = new String(ch, start, length);
		else if (tagName.equals("sex"))
			sex = new String(ch, start, length);
		else if (tagName.equals("status"))
			status = new String(ch, start, length);
		else if (tagName.equals("address"))
			address = new String(ch, start, length);
		else if (tagName.equals("money"))
			money = new String(ch, start, length);
	}

	//打开一个标签的内容
	private void printout() {
		System.out.print("name: ");
		System.out.println(hisname);
		System.out.print("sex: ");
		System.out.println(sex);
		System.out.print("status: ");
		System.out.println(status);
		System.out.print("address: ");
		System.out.println(address);
		System.out.print("money: ");
		System.out.println(money);
		System.out.println();
	}

}
在Activity中添加一个按钮来触发下载和解析xml文件

package com.example.xml;

import java.io.StringReader;

import javax.xml.parsers.SAXParserFactory;

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

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

import com.example.utils.HttpDownloader;

public class MainActivity extends Activity {

	private Button parseBtn = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		parseBtn = (Button)findViewById(R.id.parse);
		parseBtn.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				HttpDownloader hd = new HttpDownloader();
				String resultStr = hd.download("http://192.168.0.152:8080/mp3/test.xml");
				//System.out.println("parseBtn " + resultStr);
				try{
					//创建一个SAXParserFactory
					SAXParserFactory factory = SAXParserFactory.newInstance();
					XMLReader reader = factory.newSAXParser().getXMLReader();
					//为XMLReader设置内容处理器
					reader.setContentHandler(new MyContentHandler());
					//开始解析文件
					reader.parse(new InputSource(new StringReader(resultStr)));
				}
				catch(Exception e){
					e.printStackTrace();
				}
			}
		});
	}
}

解析出来的结果

Android开发偏下载Tomcat服务器的xml文件并使用SAX解析

样式代码

点击打开链接