Android中XML数据解析

转载请注明出处:http://blog.csdn.net/yegongheng/article/details/38296207


XML初步

       今天我们来学习另一种非常重要的数据交换格式-XML。XML(Extensible Markup Language的缩写,意为可扩展的标记语言),它是一种元标记语言,即定义了用于定义其他特定领域有关语义的、结构化的标记语言,这些标记语言将文档分成许多部件并对这些部件加以标识。XML 文档定义方式有:文档类型定义(DTD)和XML Schema。DTD定义了文档的整体结构以及文档的语法,应用广泛并有丰富工具支持。XML Schema用于定义管理信息等更强大、更丰富的特征。XML能够更精确地声明内容,方便跨越多种平台的更有意义的搜索结果。它提供了一种描述结构数据的格式,简化了网络中数据交换和表示,使得代码、数据和表示分离,并作为数据交换的标准格式,因此它常被称为智能数据文档。
      由于XML具有很强的扩展性,致使它需要很强的基础规则来支持扩展,所以在编写XML文件时,我们应该严格遵守XML的语法规则,一般XML语法有如下规则:(1)起始和结束的标签相匹配;(2)嵌套标签不能相互嵌套;(3)区分大小写。下面是给出了一个编写错误的XML文件以及对其的错误说明,如下:

本文只是对XML做了个简单的介绍,要想学习更多有关XML知识,可以访问如下网站:http://bbs.xml.org.cn/index.asp
XML在实际应用中比较广泛,Android也不例外,作为承载数据的重要角色,如何读写XML称为Android开发中一项重要的技能。

Android中XML数据解析使用实例

       在Android开发中,较为常用的XML解析器有SAX解析器、DOM解析器和PULL解析器,下面我们将会一一学习如何使用这些XML解析器。那在介绍这几种XML解析器过程中,我们依然是要通过一个实例来学习它们的实际开发方法,下面是我们Demo实例的程序列表清单,如下:
   
         图1-1 客户端                                          图1-2 服务器端
来整理下我们实现的Demo实例思路:客户端通过网络请求读取服务器端的person.xml,person.xml文件中的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person id="1">
		<name>Transformers First</name>
		<height>7</height>
		<imageurl>imagefile/transformers_one.png</imageurl>
	</person>
	<person id="2">
		<name>Transformers second</name>
		<height>4</height>
		<imageurl>imagefile/transformers_two.png</imageurl>
	</person>
	 <person id="3">
		<name>Transformers third</name>
		<height>8.5</height>
		<imageurl>imagefile/transformers_three.png</imageurl>
	</person>
	<person id="4">
		<name>Transformers fourth</name>
		<height>14.5</height>
		<imageurl>imagefile/transformers_four.png</imageurl>
	</person>
	<person id="5">
		<name>Transformers fifth</name>
		<height>27.5</height>
		<imageurl>imagefile/transformers_five.png</imageurl>
	</person>
	<person id="6">
		<name>Transformers Sixth</name>
		<height>8.5</height>
		<imageurl>imagefile/transformers_six.png</imageurl>
	</person>
	<person id="7">
		<name>Transformers Seventh</name>
		<height>5</height>
		<imageurl>imagefile/transformers_seven.png</imageurl>
	</person>
	<person id="8">
		<name>Transformers Eighth</name>
		<height>12.5</height>
		<imageurl>imagefile/transformers_eight.png</imageurl>
	</person>
</persons>
接着 将获取到的person.xml的文件流信息分别使用SAX、DOM和PULL解析方式解析成Java对象,然后将解析后获取到的Java对象信息以列表的形式展现在客户端,思路很简单吧。
Demo实例工程的下载地址:
好了,基本了解了Demo实例的整体思路后,接下来我们将学习如何具体实现它们。

SAX解析XML文件实例

       SAX(Simple For XML)是一种基于事件的解析器,它的核心是事件处理模式,它主要是围绕事件源和事件处理器来工作的。当事件源产生事件后,会调用事件处理器中相应的方法来处理一个事件,那在事件源调用对应的方法时也会向对应的事件传递一些状态信息,以便我们根据其状态信息来决定自己的行为。
      接下来我们将具体地学习一下SAX解析工作的主要原理:在读取XML文档内容时,事件源顺序地对文档进行扫描,当扫描到文档的开始与结束(Document)标签、节点元素的开始与结束(Element)标签时,直接调用对应的方法,并将状态信息以参数的形式传递到方法中,然后我们可以依据状态信息来执行相关的自定义操作。为了更好的理解SAX解析的工作原理,我们结合具体的代码来更深入的理解下,代码如下:
/**
 * SAX解析类
 * @author AndroidLeaf
 */
public class MyHandler extends DefaultHandler {

	//当开始读取文档标签时调用该方法
	@Override
	public void startDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.startDocument();
	}

	//当开始读取节点元素标签时调用该方法
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		super.startElement(uri, localName, qName, attributes);
		//do something
	}

	//当读取节点元素的子类信息时调用该方法
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		// TODO Auto-generated method stub
		super.characters(ch, start, length);
		//do something
	}
	
	//当结束读取节点元素标签时调用该方法
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		// TODO Auto-generated method stub
		super.endElement(uri, localName, qName);
		//do something
	}
	
	//当结束读取文档标签时调用该方法
	@Override
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.endDocument();
		//do something
	}

}
首先我们先认识一个重要的类--DefaultHandler,该类是XML解析接口(EntityResolver, DTDHandler, ContentHandler, ErrorHandler)的缺省实现,在通常情况下,为应用程序扩展DefaultHandler并覆盖相关的方法要比直接实现这些接口更容易。接着重写startDocument(),startElement(),characters(),endElement和endDocument()五个方法,这些方法会在事件源(在org.xml.sax包中的XMLReader,通过parser()产生事件)读取到不同的XML标签所产生事件时调用。那我们开发时只要在这些方法中实现我们的自定义操作即可。下面总结罗列了一些使用SAX解析时常用的接口、类和方法:

事件处理器名称

事件处理器处理的事件

ContentHandler

XML文档的开始与结束;

XML文档节点元素的开始与结束,接收字符数据,跳过实体,接收元素内容中可忽略的空白等。

DTDHandler

处理DTD解析时产生的相应事件

ErrorHandler

处理XML文档时产生的错误

EntityResolver

处理外部实体

方法名称

方法说明

startDocument()

用于处理文档解析开始时间

startElement(String uri,String localName,String qName

 Attributes attributes)

处理元素开始时间,从参数中可以获取元素所在空间的URL,元素名称,属性列表等信息。

characters(char[] ch,int start,int length)

处理元素的字符内容,从参数中可以获得内容

endElement(String uri,String localName,String qName)

处理元素结束时间,从参数中可以获取元素所在空间的URL,元素名称等信息。

endDocument()

用于处理文档解析的结束事件







  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值