`

Android XML解析——Sax解析XML

阅读更多

 以下文章是从老罗教学中的总结,感谢老罗

 

ØSAX是一种以事件驱动的XML api,由它定义的事件流可以指定从解析器传到专门的处理程序的代码的XML

   结构,简单的讲,它解析速度快,占用内存少的解析器。这种解析器比较适合android 等移动设备。

 
Ø使用SAX的优点是:
  因为SAX的优势是流的方式处理,当遇到一个标签的时候,并不会记录下当前所碰到的标签。
  也就是说,startEelment方法中,你所知道的信息,仅仅是当前的签名的名字和属性,至于标签的嵌套结
  构,上层标签的名字,是否有子元素与其他结构相关的信息,都是不知道的。
  
  需要解析的XML
  
<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person id="1">
        <name>张三</name>
        <age>20</age>
    </person>
     <person id="2">
        <name>李四</name>
        <age>24</age>
    </person>
</persons>
 
 
package com.sax.handler;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.jar.Attributes.Name;

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

public class MyHandler extends DefaultHandler {

	private HashMap<String, String> map = null;// 存储单个解析的完整对象
	private List<HashMap<String, String>> list = null;// 存储所有的解析对象
	private String currentTag = null;// 正在解析的元素的标签
	private String currentValue = null;// 解析当前元素的值
	private String nodeName = null;// 解析当前的节点名称

	public MyHandler(String nodeName) {
		this.nodeName = nodeName;
	}

	public List<HashMap<String, String>> getList() {
		return list;
	}

	@Override
	public void startDocument() throws SAXException {
		// 当读到第一个开始标签的时候,会触发这个方法
		list = new ArrayList<HashMap<String, String>>();
	}

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		// 当遇到文档的开头的时候,调用这个方法
		if (qName.equals(nodeName)) {
			map = new HashMap<String, String>();
		}
		if (attributes != null && map != null) {
			for (int i = 0; i < attributes.getLength(); i++) {
				map.put(attributes.getQName(i), attributes.getValue(i));
			}
		}
		currentTag = qName;
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		// 这个方法是用来处理xml文件所读取到的内容
		if (currentTag != null && map != null) {
			currentValue = new String(ch, start, length);
			if (currentValue != null && !currentValue.trim().equals("")
					&& !currentValue.trim().equals("\n")) {
				map.put(currentTag, currentValue);
			}
		}
		currentTag = null;// 把当前的节点的对应的值和标签设置为空
		currentValue = null;

	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		// 遇到结束标记的时候,会调用这个方法
		if (qName.equals(nodeName)) {
			list.add(map);
			map = null;
		}
		super.endElement(uri, localName, qName);
	}
}

 

package com.sax.http;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpUtils {

	public HttpUtils() {
	}

	public static InputStream getXML(String path) {
		InputStream inputStream = null;
		try {
			URL url = new URL(path);
			if (url != null) {
				HttpURLConnection connection = (HttpURLConnection) url
						.openConnection();
				connection.setConnectTimeout(3000);
				connection.setDoInput(true);
				connection.setRequestMethod("GET");
				int code = connection.getResponseCode();
				if (code == 200) {
					inputStream = connection.getInputStream();
				}
			}
		} catch (Exception e) {
		}
		return inputStream;
	}
}

 

package com.sax.service;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import com.sax.handler.MyHandler;

public class SaxService {

	public SaxService() {
	}

	public static List<HashMap<String, String>> readXML(
			InputStream inputStream, String nodeName) {
		try {
			// 创建一个解析xml的工厂对象
			SAXParserFactory spf = SAXParserFactory.newInstance();
			SAXParser parser = spf.newSAXParser();// 解析xml
			MyHandler handler = new MyHandler(nodeName);
			parser.parse(inputStream, handler);
			inputStream.close();
			return handler.getList();
		} catch (Exception e) {
		}
		return null;
	}
}

 

package com.sax.test;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;

import com.sax.http.HttpUtils;
import com.sax.service.SaxService;

public class Test {

	public Test() {
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String path = "http://192.168.0.102:8080/myhttp/person.xml";
		InputStream inputStream = HttpUtils.getXML(path);
		try {
			List<HashMap<String, String>> list = SaxService.readXML(
					inputStream, "person");
			for (HashMap<String, String> map : list) {
				System.out.println(map.toString());
			}
		} catch (Exception e) {
		}
	}

}

 

 

分享到:
评论

相关推荐

    Android XML解析—— Pull解析XML(待完善)

    XML解析是将XML文档转换为程序可以理解的结构化数据的过程。本文主要关注Android中的Pull解析方式来处理XML,这是一种轻量级、低内存占用的解析方法。 **什么是XML Pull解析** XML Pull解析器(XML Pull Parser)...

    android开发之xml文件操作——SAX

    在Android项目中,我们通常需要以下步骤来使用SAX解析XML: 1. 创建一个继承自`DefaultHandler`的类,比如我们可以命名为`MySAXHandler`。在这个类中,我们需要重写`startElement`、`endElement`和`characters`方法...

    Android中,使用SAX和PULL解析天气预报XML

    本文将深入探讨如何在Android中使用两种常见的XML解析技术——SAX(Simple API for XML)和PULL(Pull Parser)来解析天气预报的XML数据。这两种方法各有优缺点,适用于不同的场景。 首先,我们来看SAX解析器。SAX...

    安卓Android源码——比较通用的xml解析方法.rar

    本资料包“安卓Android源码——比较通用的xml解析方法”将深入探讨在Android平台上解析XML的多种方法。 1. DOM解析器(Document Object Model) DOM解析器将整个XML文档加载到内存中,创建一个树形结构,便于遍历和...

    Android创建与解析XML(三)——详解Sax方式

    本文将深入讲解如何在Android中使用SAX解析XML以及如何通过SAX方式创建XML。 **1. SAX解析XML** SAX解析XML的基本流程是:创建SAXParserFactory,通过该工厂实例化SAXParser,然后设置事件处理器(ContentHandler...

    安卓Android源码——比较通用的xml解析方法.zip

    本资源“安卓Android源码——比较通用的xml解析方法.zip”显然聚焦于探讨在Android平台上解析XML的不同方法。这里我们将深入探讨两种主要的XML解析技术:SAX(Simple API for XML)和DOM(Document Object Model),...

    android开发之xml文件操作——xml创建和pull解析xml

    本项目主要关注的是XML的创建和使用Pull解析器来解析XML,这是Android系统中处理XML数据的一种高效方法。接下来,我们将详细讨论这两个知识点。 首先,XML(Extensible Markup Language)是一种用于标记数据的语言...

    Android 封装pull解析xml

    本文将重点介绍SAX解析的一种实现方式——Pull解析。 Pull解析器(XMLPullParser)是Android SDK提供的一种轻量级、高效的XML解析方式,它不需要创建整个XML文档的树结构,而是通过事件触发的方式解析XML,从而节省...

    Android 解析 XML 三种方法

    总结,Android解析XML的三种方法——SAX、DOM和PULL,各有适用场景。理解它们的工作原理和优缺点,可以帮助我们更好地选择和运用XML解析技术,提高应用的效率和用户体验。在实践中不断学习和探索,才能真正掌握这些...

    android之xml解析

    ### Android之XML解析——SAX解析器详解 #### 一、引言 在Android开发过程中,XML文件是非常常见的一种数据格式。为了能够更好地理解和利用XML文件中的数据,开发者需要掌握几种常用的XML解析技术。其中,SAX...

    android的xml文件的解析

    4. 数据交换:在某些情况下,例如网络通信或本地数据存储,可能会用到SAX解析XML数据。 六、使用示例 1. DOM解析:使用`javax.xml.parsers.DocumentBuilderFactory`和`org.w3c.dom.Document`进行解析。 2. SAX解析...

    Android基础——XML数据的三种解析方式

    总结来说,Android中解析XML时,DOM适用于小型且需要频繁访问的文件,SAX和Pull解析适合大型文件或资源有限的环境。选择哪种解析方式取决于具体应用场景和性能需求。理解并熟练掌握这三种解析方式,将有助于提升...

    android实例xml解析

    "android实例xml解析"这个主题主要涉及如何在Android应用中处理XML文件,包括读取、解析和操作XML内容。以下是对这个主题的详细阐述: 1. XML简介: XML(eXtensible Markup Language)是一种可扩展标记语言,它...

    Android网络下的XML解析和生成

    除了DOM和SAX,Android还提供了另一种解析XML的方式——Pull解析器(PullParser),它是基于事件驱动的轻量级解析器,类似于SAX,但更易于使用。`android.util.Xml`提供了一个`PullParser`的实现。 示例代码: ```...

    Android中XML解析

    本篇将详细介绍Android中XML解析的两种主要方法:DOM(Document Object Model)解析和SAX(Simple API for XML)解析。 **DOM解析** DOM解析器将整个XML文档加载到内存中,形成一个树形结构,称为DOM树。每个节点...

    Android应用源码之比较通用的xml解析方法.zip

    本实例深入探讨了在Android中解析XML的通用方法,这对于理解Android应用内部的工作原理至关重要。以下是对该主题的详细讲解: 一、XML简介 XML是一种标记语言,它的设计目标是传输和存储数据,而不是显示数据。它...

Global site tag (gtag.js) - Google Analytics