俩种XML解析SAX解析和Pull解析

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">SAX是基于事件流,而DOM是基于文档树结构。 </span>

DOM原理:先将文件读取进入一个驻入内存的树结构。因为在内存,便于操作和管理,但是浪费资源和时间。

SAX原理: 基于事件,这个表示读取到xml的结点会根据结点名称来读取相应的数据,占用资源少。但是无状态,非持久,如果数据没保存就没了。

DOM4J:很好很强大。

JDOM:就是对SAX的封装。适合简单的创建和解析。

今天使用的例子就是安卓使用的SAX和安卓自带的Pull解析。

先看看实验citys.xml

<?xml version="1.0" encoding= "UTF-8"?>
<citys>
       <city id= "23">
             <name>nice</name>
             <number>30</ age>
       </city>

       <city id="20">
             <name>work</name>
             <number>23</ age>
       </city>
</citys>

第一种解析方式SAX

/**
	 * SAX解析
	 */
	@Override
	public List<City> parseXmlBySax(InputStream iis) throws Exception {
		List<City> list = new ArrayList<City>();
		SAXParserFactory spf = SAXParserFactory.newInstance();
		SAXParser parser = spf.newSAXParser(); // 通过工厂获得解析器

		CityContextHandler handler = new CityContextHandler();
		parser.parse(iis, handler); // 传一个流和处理器 这样体现了一种思想 有点像适配器 需要什么就写什么
		iis.close(); // 小细节 关闭流
		list = handler.getList();
		return list;
	}
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * 处理器需要基础DefaultHandler
 * 重写startDocument()   startElement()  endElement()   characters()
 * 最好是根据xml新建一个JavaBean   操作方便
 *
 * @author suibian
 *
 */
public class CityContextHandler extends DefaultHandler {
	private List<City> list=null;
	private City city=null;
	private String targetname=null;

	public List<City> getList() {
		return list;
	}

	/**
	 * 开始就初始化集合
	 */
	@Override
	public void startDocument() throws SAXException {
		list=new ArrayList<City>();
	}

	/**
	 * 元素开头要判断
	 * 如果是city则初始化
	 * 		 name则set
	 * 		 location则set
	 */
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		if(localName.equals("citys")){   //这一句我自己加上去的
			return;
		}
		 if(localName.equals("city")){
			 this.city=new City();
			 city.setId(Integer.valueOf(attributes.getValue("id")));
		 }
		 this.targetname=localName;
	}

	/**元素结尾
	 * 如果是city则加入集合中  设置city=null
	 */
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		 if(localName.equals("city")){
			 list.add(city);
			 city=null;
		 }
		 this.targetname=null;
	}

	/**
	 * 给JavaBean注参处理
	 */
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		String data=new String(ch,start,length);
		 if(this.targetname!=null&&(!(data.equals("")))){
			 if(this.targetname.equals("name")){
				 this.city.setName(data);
			 }else{
				 this.city.setNumber(data);
			 }
		 }
	}
}

第二种Pull解析

/**
	 * Pull解析
	 * 错误:这玩意非得在线程中才能得到正确的结果
	 * 在流中解析,是边解析边连接
	 */
	@Override
	public  List<City> parseXmlByPull(InputStream iis) throws Exception {
		List<City> list = null;
		City city = null;
		XmlPullParser pull = XmlPullParserFactory.newInstance().newPullParser();
		pull.setInput(iis, "UTF-8");
		int event = pull.getEventType();
		while (event != XmlPullParser.END_DOCUMENT) {
			switch (event) {
			case XmlPullParser.START_DOCUMENT:
				list = new ArrayList<City>();
				break;
			case XmlPullParser.START_TAG:
				if (pull.getName().equals("city")) {
					city = new City();
					city.setId(Integer.valueOf(pull.getAttributeValue(0)));
				}
				if (pull.getName().equals("name")) {
					city.setName(pull.nextText());
				}

				if (pull.getName().equals("number")) {
					city.setNumber(pull.nextText());
				}
				break;
			case XmlPullParser.END_TAG:
				if (pull.getName().equals("city")) {
					list.add(city);
					city = null;
				}
				break;
			}
			event = pull.next();
		}
		return list;
	}

这个困惑了我好久,出现了错误为什么setup() must be ....... @1 null 什么的 不记得了,这个是提示测试的时候是要放在一个线程中才能解析的,后来在https://github.com/blog 才找到的答案,庆幸英语水平还勉强看得懂。

关于DOM解析什么的就不多说了,总之想说的是,这个只是工具,拿来用就是了,至于原理懂了行。

我是菜鸟,我在路上。

2015年5月17日23:48:20

时间: 2024-10-17 20:07:42

俩种XML解析SAX解析和Pull解析的相关文章

android解析XML总结-SAX、Pull、Dom三种方式

在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX.Pull.Dom解析方式.最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一次总结. xml示例(channels.xml)如下: <?xml version="1.0" encoding="utf-8"?> <channel> <item id="0&q

Java sax、dom、pull解析xml

-------------------------------------SAX解析xml---------------------------------- >Sax定义 SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于android等移动设备 SAX全称是Simple API for Xml,既是指一种接口,也是一个软件包 作为接口,sax是事件驱动型xml解析的一个标准接口 >Sax特点 1. 解析效率高,占用内存少 2.可以随时停止解析 3.不能载入整个文档到内存 4.

【幻化万千戏红尘】qianfengDay28-XML解析之SAX和PULL解析基础学习:

课程回顾:HTTP协议:超文本传输协议目前互联网中使用最为广泛的通信协议 URL:统一资源定位符常用的方式:1.HttpURLConnection使用步骤: 1.创建URL对象 2.创建连接对象 3.设置请求属性 4.连接 5.验证状态响应码 6.获取服务器响应信息 7.释放 2.okHttp使用步骤: 1.创建客户端对象 2.创建请求内容对象(POST) 3.创建请求对象 4.创建响应对象 5.验证是否成功 6.获取响应内容 今日内容:XML:EXtensible Markup Languag

Android下使用pull解析器生成XML文件、读取XML文件

Android下使用Pull解析器 1,Pull解析器的运行方式与SAX解析器相似.它提供了类似的事件,如:开始元素和结束元素事件. 2,使用parser.next()可以进入下一个元素并触发相应事件. 3,事件将作为一个int数值被发送,因此可以使用一个switch对相应的事件进行处理. 4,当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值. 5,相关API: 获得当前节点事件类型:parser.getEventType(); 获得下一节点事件类型

安卓使用pull解析器解析XML文件

学习一下: 1 public class MainActivity extends Activity { 2 3 List<City> cityList; 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.activity_main); 8 } 9 10 public void cli

Android DOM、SAX、Pull解析XML(转)

本篇随笔将详细讲解如何在Android当中解析服务器端传过来的XML数据,这里将会介绍解析xml数据格式的三种方式,分别是DOM.SAX以及PULL. 一.DOM解析XML 我们首先来看看DOM(Document Object Model)这种方式解析xml,通过DOM解析xml在j2ee开发中非常的常见,它将整个xml看成是一个树状的结构,在解析的时候,会将整个xml文件加载到我们的内存当中,然后通过DOM提供的API来对我们的xml数据进行解析,这种方式解析xml非常的方便,并且我们可以通过

DOM/SAX/PULL解析XML

1. 代码结构 InterfaceXMLParseService 解析接口, DOM/SAX/PULL分别实现这个接口 XML来源是assets目录下的persons.xml文件 2. 代码 //persons.xml <?xml version="1.0" encoding="utf-8"?> <persons> <person> <id>1</id> <name>Tom</name&g

非常简单的XML解析(SAX解析、pull解析)

这里只是把解析的数据当日志打出来了 非常简单的xml解析方式 1 package com.example.demo.service; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 6 import javax.xml.parsers.DocumentBuilder; 7 import javax.xml.parsers.DocumentBuilderFactory; 8 import javax.xml.parse

XML的两种解析方式逐行解析(SAX解析)节点解析(DOM解析);

SAX逐行解析 SAX:SimpleAPIfor XML.基于事件驱动的解析方式,逐行解析数据.(采用协议回调机制) NSXMLParser是iOS自带的XML解析类.采用SAX方式解析数据 解析过程由NSXMLParserDelegate协议方法回调 解析过程:开始标签->取值->结束标签->取值 DOM解析 DOM:DocumentObjectModel(文档对象模型).解析时需要将XML文件整体读入,并且将XML结构化成树状,使用时再通过树状结构读取相关数据 GDataXMLNod