android_xml 文件解析

解析XML文件基本的解析方式有两种,一种叫SAX,另一种叫DOM:

1、DOM生成和解析XML文档

DOM,全称Document Object Model(文档对象模型),为 XML 文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。 优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能; 缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间; 使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。

2、SAX生成和解析XML文档

为解决DOM的问题,出现了SAX。SAX ,事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。优点:不用事先调入整个文档,占用资源少;SAX解析器代码比DOM解析器代码小,适于Applet,下载。缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;使用场合:Applet;只需XML文档的少量内容,很少回头访问;机器内存少;等等

在这里就使用SAX来解析XML。

SAX全称SimpleAPI for XML,既是一种接口,也是指一个软件包。作为接口,SAX是事件驱动型XML解析的一个标准接口。

(1)SAX工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。

(2)大部分SAX实现都会产生以下类型的事件

- 在文档的开始和结束时触发文档处理事件;

- 在文档内每一XML元素接受解析的前后触发元素事件;

- 任何元数据通常都由单独的事件交付;

- 在处理文档的DTD或Schema时产生DTD或Schema事件;

- 产生错误事件用来通知主机应用程序解析错误;

(3)SAX模型

(4)解析文档过程

对于这个文档

12<doc>

3<para>4Hello World!
5</para>6

</doc>7

总共产生7个事件,包括:

- 创建事件处理程序;

- 创建SAX解析器;

- 将事件处理程序分配给解析器;

- 对文档进行解析,将事件发送给处理程序;

ContentHandler接口是java类包中一个特殊的SAX接口,其中常用的接口有5个:

startDocument():Receive notification of the beginning of a document.

endDocument():Receive notification of the end of a document.

startElement(String uri, String localName, String qName, Attributes atts)

Receive notification of the beginning of an element.

endElement(String uri, String localName, String qName):Receive notification of the end of an element.

characters(char[] ch, int start, int length):Receive notification of character data.

(5)例子

XMLActivity.java

package chay.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;

public class XMLActivity extends Activity {

	private Button parseBtn;
	String xmlStr = "<school><stu id='001'><name>Chay</name><sex>男</sex><age>22</age></stu><stu id='002'><name>Mark</name><sex>女</sex>	<age>40</age></stu></school>";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		parseBtn = (Button) findViewById(R.id.parseBtn);
		parseBtn.setOnClickListener(new ParseButtonListener());
	}
	// 按钮监听,点击开启线程
	class ParseButtonListener implements OnClickListener {
		public void onClick(View arg0) {
			Thread t = new XMLThread();
			t.start();
		}
	}

	class XMLThread extends Thread {
		@Override
		public void run() {
			try {
				// 创建一个SAXParserFactory
				SAXParserFactory factory = SAXParserFactory.newInstance();
				XMLReader reader = factory.newSAXParser().getXMLReader();
				// 为XMLReader设置内容处理器
				reader.setContentHandler(new MyContentHandler());
				// 开始解析xml,并且调用相应的事件响应函数
				reader.parse(new InputSource(new StringReader(xmlStr)));
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

XMLContentHandler.java

package chay.xml;

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

public class XMLContentHandler extends DefaultHandler {
	String name, sex, age;
	String tagName;

	@Override
	public void startDocument() throws SAXException {
		System.out.println("--- start Document ---");
	}

	@Override
	public void endDocument() throws SAXException {
		System.out.println("--- end Document ---");
	}

    //uri:得到当前解析正在解析标签的命名空间(namespaceURI,命名空间,是防止标签重名)
    //localName:得到没有前缀标签 <abc:name>  得到name
    //qName:得到带前缀的标签 <abc:name>  得到abc:name
    //attr:得到标签的属性 <stu id="001">  得到id="001"
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attr) throws SAXException {
		tagName = localName;
		if (localName.equals("stu")) {
			// 获取标签的所有属性
			for (int i = 0; i < attr.getLength(); i++) {
				System.out.println(attr.getLocalName(i) + "=" + attr.getValue(i));
			}
		}
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		// 在stu标签解析完之后,打印所有得到的数据
		tagName = "";
		if (localName.equals("stu")) {
			this.prinout();
		}
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		String temp = new String(ch, start, length);
		if (tagName.equals("name")) {
			name = new String(temp);
		} else if (tagName.equals("sex")) {
			sex = new String(temp);
		} else if (tagName.equals("age")) {
			age = new String(temp);
		}
	}

	private void prinout() {
		System.out.println("name--->" + name);
		System.out.println("sex--->" + sex);
		System.out.println("age--->" + age);
	}
}

上面继承的是DefaultHandler而不是ContentHandler,这是一种适配器模式,因为ContentHandler中有很多的方法不用实现。

时间: 2024-10-08 15:48:58

android_xml 文件解析的相关文章

Intel HEX文件解析

近期有一个需求就是为Arduino开发板做一个基于蓝牙的无线烧录程序.眼下的Arduino程序都是通过USB线连接到电脑的主机上,实际的传输过程是基于USB协议的,这个过程还是比較麻烦的.由于每次的编译完以后都须要通过一个USB线来完毕传输烧录的工作,这个还是非常麻烦的. 原理解读 在Arduino中.利用USB来完毕传输烧录大概是这么一个过程. 每一个Arduino源程序.即sketch文件,经过一系列的编译处理以后.终于会形成一个Intel HEX格式的文件.这个HEX文件事实上就一个被封装

AndroidNative层文件解析漏洞挖掘指南

| 导语 本文以手Q的一次文件解析类漏洞挖掘为例,叙述了Android Native层文件解析类型漏洞挖掘的过程 手Q这个应用从功能来说十分的庞大,如果使用类似MFFA的框架去挖掘文件解析类漏洞,效率低,而且文件入口在哪儿.如何利用脚本进行自动化都是非常大的问题.本文在一次手Q的文件解析类漏洞挖掘的过程中,提出了一种可能的解决问题的方案,妄称指南不吝赐教. 目录: 1.问题分析 2.流程图 3.so筛选 4.测试程序编写 5.test case生成 6.测试得出crash 7.未来的工作 0x0

Atitit。Tree文件解析器的原理流程与设计实现&#160;&#160;java&#160;&#160;c#&#160;php&#160;js

Atitit.Tree文件解析器的原理流程与设计实现  java  c# php js 1. 解析原理与流程1 1.1. 判断目录  ,表示服  dirFlagChar = "└├─";1 1.2. 剑豪制表符出现的位置与文件夹级别对应表1 1.3. 主要判读流程2 2. Tree结果2 3. Code----3 4. 结果5 1. 解析原理与流程 1.1. 判断目录  ,表示服  dirFlagChar = "└├─"; 其中-类似于剑豪的制表符是表示目录的..够

基于Android2.3.5系统:Android.mk文件解析

*************************************************************************************************************************** 作者:EasyWave                                                                                                               时间:2

java class 文件解析

参考下面两个文章对一个class文件进行解析: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.4.6 http://blog.163.com/hfut_quyouhu/blog/static/7847183520127214559314/ java的源代码如下: 1 package test.java.abs; 2 3 public class Abs { 4 5 /** 6 * @param args

emmintrin.h文件解析

 Welcome to CSU Online Judge! 1112: 机器人的指令 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 274  Solved: 97 [Submit][Status][Web Board] Description 数轴原点有一个机器人.该机器人将执行一系列指令,你的任务是预测所有指令执行完毕之后它的位置. ·LEFT:往左移动一个单位 ·RIGHT: 往右移动一个单位 ·SAME AS i: 和第i 条执行相同的

转载:AAC文件解析及解码

转自:http://blog.csdn.net/wlsfling/article/details/5876016 http://www.cnblogs.com/gaozehua/archive/2012/05/03/2479960.html OUTLINE: * AAC概述 * AAC规格简述 * AAC特点 * AAC音频文件解析 --ADIF&ADTS格式 --ADIF&ADTS头信息 --ADIF&ADTS数据信息 --AAC文件处理流程 * AAC解码流程 --技术解析 *

javap -- Java 类文件解析器

参考文档 http://blog.chinaunix.net/uid-692788-id-2681132.html http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javap.html 功能说明:Java 类文件解析器. 语法:javap [ 命令选项 ] class. . . 补充说明: javap 命令用于解析类文件.其输出取决于所用的选项.若没有使用选项,javap 将输出传递给它的类的 public 域及方法.ja

android基础知识13:AndroidManifest.xml文件解析

1.重要性 AndroidManifest.xml是Android应用程序中最重要的文件之一.它是Android程序的全局配置文件,是每个 android程序中必须的文件.它位于我们开发的应用程序的根目录下,描述了package中的全局数据,包括package中暴露的组件 (activities, services, 等等),以及他们各自的实现类,各种能被处理的数据和启动位置等重要信息. 因此,该文件提供了Android系统所需要的关于该应用程序的必要信息,即在该应用程序的任何代码运行之前系统所