以下文章是从老罗教学中的总结,感谢老罗
Ø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解析之SAX解析 简单方便的解析方法
在Android中,常见的XML解析器分别为SAX解析器、DOM解析器和PULL解析器. 这里的源代码介绍的是Android XML解析之SAX方式
学习xml——sax解析的项目小示例 非常简单易懂 而且包括多种sax解析的方法 如xmlReader,saxBuilder工厂,还包括一个dom解析的示例(DocumentBuilder工厂)
010303_XML解析 —— SAX 010304_XML解析 —— JDOM 010305_XML解析 —— DOM4J 010306_使用JavaScript操作DOM 010401_Tomcat服务器的安装及配置 020501_注释及Scriptlet 020502_page指令 020503_包含指令 020504_...
NULL 博文链接:https://byandby.iteye.com/blog/836754
XML解析之SAX解析DEMO,之前在播控上有介绍,但是代码排版太乱了,这个就是Android4.0网络编程中的SAX解析例子。
Android XML解析 SAX DOM Pull 以person类为例进行解析,适合初学者学习
android xml解析,sax pull dom三个解析
android xml 解析 生成xml sax pull dom
Android 创建与解析XML Sax方式
一个项目同时用dom解析和sax解析xml文件貌似会报错,项目框架建一直是用sax和dom4j解析xml文件的。当我用dom解析xml文件。导入包后就报错识别不了xml文件的编码格式。于是做了一个sax解析xml文件的实例
这是一个完整的eclipse项目,打开后就可以看代码~
android 应用程序 做的 解析xml 用了三种技术 sax dom pull 三种解析xml的常用技术 另外还有一些怎么快速的让指定文件读取到xml文件中
提供了android中使用dom、pull、sax三种方式进行xml解析,xml文件放置在assets文件夹下,view绑定使用butterknife
在JAVA中有两种常见的XML解析方式,DOM和SAX,DOM在解析的时候会将所有的数据一次性载入内存中进行解析,在数据量比较大的情况下,效率非常低.尤其在手机这种对内存和性能要求比较苛刻的设备里面这种方法并不可取. ...
java学习笔记——使用DOM解析XML和使用SAX解析XML
Android SAX 解析XML SAX 解析XML(通用)
android解析XML使用SAX方法,文件样例。路径为SDCARD里的XML。当然也可以通过网络来下载XML再进行解析
虽然SAX(Simple API for XML)解析器是解析XML十分方便的工具,但开发和维护SAX解析器是十分困难的,本文会告诉你如何使用XML Schemas中的信息来生成一个SAX解析器的框架源码,并且完成解析xml的技术