以下文章是从老罗教学中的总结,感谢老罗
Ø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) { } } }
相关推荐
XML解析是将XML文档转换为程序可以理解的结构化数据的过程。本文主要关注Android中的Pull解析方式来处理XML,这是一种轻量级、低内存占用的解析方法。 **什么是XML Pull解析** XML Pull解析器(XML Pull Parser)...
在Android项目中,我们通常需要以下步骤来使用SAX解析XML: 1. 创建一个继承自`DefaultHandler`的类,比如我们可以命名为`MySAXHandler`。在这个类中,我们需要重写`startElement`、`endElement`和`characters`方法...
本文将深入探讨如何在Android中使用两种常见的XML解析技术——SAX(Simple API for XML)和PULL(Pull Parser)来解析天气预报的XML数据。这两种方法各有优缺点,适用于不同的场景。 首先,我们来看SAX解析器。SAX...
本资料包“安卓Android源码——比较通用的xml解析方法”将深入探讨在Android平台上解析XML的多种方法。 1. DOM解析器(Document Object Model) DOM解析器将整个XML文档加载到内存中,创建一个树形结构,便于遍历和...
本文将深入讲解如何在Android中使用SAX解析XML以及如何通过SAX方式创建XML。 **1. SAX解析XML** SAX解析XML的基本流程是:创建SAXParserFactory,通过该工厂实例化SAXParser,然后设置事件处理器(ContentHandler...
本资源“安卓Android源码——比较通用的xml解析方法.zip”显然聚焦于探讨在Android平台上解析XML的不同方法。这里我们将深入探讨两种主要的XML解析技术:SAX(Simple API for XML)和DOM(Document Object Model),...
本项目主要关注的是XML的创建和使用Pull解析器来解析XML,这是Android系统中处理XML数据的一种高效方法。接下来,我们将详细讨论这两个知识点。 首先,XML(Extensible Markup Language)是一种用于标记数据的语言...
本文将重点介绍SAX解析的一种实现方式——Pull解析。 Pull解析器(XMLPullParser)是Android SDK提供的一种轻量级、高效的XML解析方式,它不需要创建整个XML文档的树结构,而是通过事件触发的方式解析XML,从而节省...
总结,Android解析XML的三种方法——SAX、DOM和PULL,各有适用场景。理解它们的工作原理和优缺点,可以帮助我们更好地选择和运用XML解析技术,提高应用的效率和用户体验。在实践中不断学习和探索,才能真正掌握这些...
### Android之XML解析——SAX解析器详解 #### 一、引言 在Android开发过程中,XML文件是非常常见的一种数据格式。为了能够更好地理解和利用XML文件中的数据,开发者需要掌握几种常用的XML解析技术。其中,SAX...
4. 数据交换:在某些情况下,例如网络通信或本地数据存储,可能会用到SAX解析XML数据。 六、使用示例 1. DOM解析:使用`javax.xml.parsers.DocumentBuilderFactory`和`org.w3c.dom.Document`进行解析。 2. SAX解析...
总结来说,Android中解析XML时,DOM适用于小型且需要频繁访问的文件,SAX和Pull解析适合大型文件或资源有限的环境。选择哪种解析方式取决于具体应用场景和性能需求。理解并熟练掌握这三种解析方式,将有助于提升...
"android实例xml解析"这个主题主要涉及如何在Android应用中处理XML文件,包括读取、解析和操作XML内容。以下是对这个主题的详细阐述: 1. XML简介: XML(eXtensible Markup Language)是一种可扩展标记语言,它...
除了DOM和SAX,Android还提供了另一种解析XML的方式——Pull解析器(PullParser),它是基于事件驱动的轻量级解析器,类似于SAX,但更易于使用。`android.util.Xml`提供了一个`PullParser`的实现。 示例代码: ```...
本篇将详细介绍Android中XML解析的两种主要方法:DOM(Document Object Model)解析和SAX(Simple API for XML)解析。 **DOM解析** DOM解析器将整个XML文档加载到内存中,形成一个树形结构,称为DOM树。每个节点...
本实例深入探讨了在Android中解析XML的通用方法,这对于理解Android应用内部的工作原理至关重要。以下是对该主题的详细讲解: 一、XML简介 XML是一种标记语言,它的设计目标是传输和存储数据,而不是显示数据。它...