解析XML文件之使用SAM解析器

XML是一种常见的传输数据方式,所以在开发中,我们会遇到对XML文件进行解析的时候,本篇主要介绍使用SAM解析器,对XML文件进行解析。

SAX解析器的长处是显而易见的,那就是SAX并不须要将全部的文档都载入内存之后才进行解析。SAX是事件驱动机制的,也就是碰到元素节点、文本节点、文档节点的时候,都会触发一定的事件。我们仅仅须要在对应的回调事件里面进行对应的处理就能够了。由于这个特点,所以SAX解析占用的内存比較少。其它的解析方式,比方下一节要介绍的DOM解析器,则占用内存比較多。在解析比較小的XML文件的时候。差别不是非常大,大家哪种顺手就能够用哪种。可是当须要解析的文档达到几百K以上的时候,还是推荐使用SAX解析器或者是PULL解析器。

这几种XML的解析方式,我都会在以后的文章中进行介绍。今天重点看SAX解析器。

以下是我们要进行解析的文件格式

<?

xml version="1.0" encoding="UTF-8"?>
<persons>
	<person id="23">
		<name>liming</name>
		<age>30</age>
	</person>
	<person id="20">
		<name>lixiangmei</name>
		<age>25</age>
	</person>
</persons>

以下是我们的实体类

public class Person {
	private Integer id;
	private String name;
	private Short age;

	public Person(){}

	public Person(Integer id, String name, Short age) {
		this.id = id;
		this.name = name;
		this.age = age;
	}

	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Short getAge() {
		return age;
	}
	public void setAge(Short age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [age=" + age + ", id=" + id + ", name=" + name + "]";
	}

}

我们定义一个SAM解析器,对内容进行解析

/**
 * 使用SAX对XML文件进行解析
 *
 * @author zhaokaiqiang
 *
 */
public class SaxResolve {

	public List<Person> getPersons(InputStream inputStream) throws Exception {

		//获取SAXParser对象
		SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
		//实例化我们的解析器
		PersonHandler handler = new PersonHandler();
		//開始对输入流解析
		parser.parse(inputStream, handler);
		//关闭输入流
		inputStream.close();
		//返回结果
		return handler.getPersons();
	}

	private class PersonHandler extends DefaultHandler {

		private List<Person> persons;
		private Person person = null;
		private String tag = null;

		public List<Person> getPersons() {
			return persons;
		}

		// 当读取到xml文件的開始部分时,对persons进行初始化
		@Override
		public void startDocument() throws SAXException {
			persons = new ArrayList<Person>();
		}

		// 这种方法对元素节点进行解析,如我们数据中的<person>、<age>、<name>都属于元素节点
		// 当读取到person节点时。对Person对象进行初始化。同一时候获取到属性节点的值,并赋值给id,
		// 记录如今的节点的名称,即localName,用于Person节点内部节点的解析
		@Override
		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException {
			if (localName.equals("person")) {
				person = new Person();
				person.setId(new Integer(attributes.getValue(0)));
			}
			tag = localName;
		}

		// 这个回调方法用于对文本节点进行解析。如<age>30</age>里面的30就是属于文本节点,
		// 我们依据元素节点tag的取值,取出里面的文本节点,然后对person进行赋值
		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {

			if (tag != null) {
				String data = new String(ch, start, length);
				if ("name".equals(tag)) {
					person.setName(data);
				} else if ("age".equals(tag)) {
					person.setAge(new Short(data));
				}
			}

		}

		/*
		 * 当到达一个元素节点的结束时 比方
		 * <person id="20">
		 * 	<name>lixiangmei</name>
		 * 	<age>25</age>
		 * </person>
		 * 当到达这里的</person>节点。就会出发以下的事件。我们在这个回调方法里面将解析出的person对象
		 * 加入到persons里面,而且将person和tag进行初始化,进行下一个person节点的解析
		 */
		@Override
		public void endElement(String uri, String localName, String qName)
				throws SAXException {
			if (localName.equals("person")) {
				persons.add(person);
				person = null;
			}
			tag = null;
		}

	}

}

由于凝视比較具体,所以只是多解析。以下我们使用单元測试,对解析进行測试

//測试SAX解析
	public void testSax() throws Exception {
		//从xml文件里获取输入流
		InputStream inputStream = getClass().getClassLoader()
				.getResourceAsStream("persons.xml");
		//获取解析出的对象
		List<Person> persons = new SaxResolve().getPersons(inputStream);
		//打印
		for (Person p : persons) {
			Log.d(TAG, p.toString());
		}

	}

以下是解析结果

时间: 2024-12-11 17:03:28

解析XML文件之使用SAM解析器的相关文章

【Android进阶】解析XML文件之使用DOM解析器

在前面的文章中,介绍了使用SAX解析器对XML文件进行解析,SAX解析器的优点就是占用内存小.这篇文章主要介绍使用DOM解析器对XML文件进行解析.DOM解析器的优点可能是理解起来比较的直观,当然,每个人对不同的解析方法可能有不同的喜好.但是DOM解析器有个比较大的缺点,就是占用内存比较多,在Android中的XML解析中,还是更推荐其他的解析方式. 下面介绍使用DOM解析器对XML进行解析. 下面是我们需要解析的xml文件 <?xml version="1.0" encodin

Java:简单的解析XML文件之使用DOM解析

XML简介 要理解XML,HTML等格式,先来理解文档对象模型DOM 根据 DOM,HTML 文档中的每个成分都是一个节点,这些节点组成了一棵树.DOM 是这样规定的:整个文档是一个文档节点每个 HTML 标签是一个元素节点包含在 HTML 元素中的文本是文本节点每一个 HTML 属性是一个属性节点注释属于注释节点 节点彼此都有等级关系.HTML 文档中的所有节点组成了一个文档树(或节点树).HTML 文档中的每个元素.属性.文本等都代表着树中的一个节点.树起始于文档节点,并由此继续伸出枝条,直

Python解析xml文件遇到的编码解析的问题

使用python对xml文件进行解析的时候,如果xml文件的头文件是utf-8格式的编码,那么解析是ok的,但如果是其他格式将会出现如下异常: xml.parsers.expat.ExpatError: unknown encoding 因此,为了保证程序的正常运行,我们需要对读取的文件进行编码处理. 1.首先将读取的字符从原来的编码解析,并编码成utf-8: 2.修改xml的encoding: 代码如下: import sys import os import datetime import

Android解析XML文件

前言 在学习Android的Framework层源码时,Android大量的使用XmlPullParser来解析xml文件的源码.因此,这里也顺道介绍一下XmlPullParser的使用. XML XML(eXtensible Markup Language)中文名为可扩展标记语言.标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等. 用途 XML设计用了传送及携带数据信息,不用了表现或展示数据,HTML语言则用了表现数据,所以XML用途的焦点是它说明数据是什么

使用XML序列化器生成XML文件和利用pull解析XML文件

首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message> <sms> <body> 陈驰0 </body> <date> 1462162910995 </date> <address> 1380 </address> <type> 1 </type> &

Android中Pull解析器解析xml文件案例

首先 准备一个供解析的xml文件,这里我们假定要解析的文件名称为person.xml,文件的具体内容为: <?xml version="1.0" encoding="utf-8"?> <persons> <person id="23"> <name>liming</name> <age>23</age> </person> </persons&g

使用DOM解析器解析XML文件 学习笔记

dom解析和dom4j原理一致 Node是所有元素的父接口 常用的API: DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();取得DOM解析器工厂 DocumentBuilder domParser = factory.newDocumentBuilder();取得DOM解析器 domParser.parse(*.xml)加载需要解析的XML文件 Document.getDocumentElement()取

解析xml文件的几个步骤

1.生成xml文件的解析器 XmlPullParser parser = Xml.newPullParser(); 2.设置解析器读取流对象的编码格式 parser.setInput(is, "utf-8"); 3.设置解析xml文件之后要存储的位置 List<WeatherInfo> weatherInfo = null; WeatherInfo info = null; 4.定义解析器解析到的事件类型 int type = parser.getEventType();

SAX解析XML文件

SAX是Simple API for XML的缩写,它并不是由W3C官方所提出的标准.SAX是一种轻量型的方法,不像DOM解析时,把XML文档全部载入内存中,在PC上操作,Dom还有 优势,但在手机中端上则无优势,因为手机内存和硬件都比不上PC强.使用 SAX 是比较安全的,并且 Android 提供了一种传统的 SAX 使用方法,以及一个便捷的 SAX 包装器.SAX采用基于事件驱动的处理方式,它将XML文档转换成一系列的事件,由单独的事件处理器来决定如何处理. 在SAX接口中,事件源是org