Android解析XML方式
Android解析XML方式
Android解析XML三种方式:
1、DOM (org.w3c.dom)文档对象模型方式,解析完的XML将生成一个树状结构的对象。
2、SAX (org.xml.sax) simpleAPI for XML,以事件的形式通知程序,对XML进行解析。
3、PULL (org.xmlpull.v1) 类似SAX方式,程序以"拉取"的方式对Xml进行解析。
本篇讲解一下SAX解析XML这种方式,首先来看一下它的基本介绍:
SAX是一种以事件驱动的XML API,由它定义的事件流可以指定从解析器传到专门的处理程序的代码的XML结构,简单的讲,它是种解析速度快,占用内存少的解析器。这种解析器比较适合android等移动设备。
使用SAX的优点:
因为SAX的优势是流的处理方式,当遇到一个标签的时候,并不会记录下当前所碰到的标签。也就是说,startElement的方法中,你所知道的信息,仅仅是当前的签名的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元素与其他结构相关的信息,都是不知道的。
我们需要使用DefaultHandler这个类来解析
类 DefaultHandler
java.lang.Object
org.xml.sax.helpers.DefaultHandler
我们通过一个简单的实例来看一下如何使用SAX解析XML这门技术:
工程目录结构
几个重要java类的源代码:
MyHandler.java
- package com.sax.handler;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- 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; //当前解析的结点名称
- 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(localName)){
- 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 {
- 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;
- }
- }
- }
SaxService.java
- package com.sax.service;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import javax.xml.parsers.ParserConfigurationException;
- import javax.xml.parsers.SAXParser;
- import javax.xml.parsers.SAXParserFactory;
- import org.xml.sax.SAXException;
- import com.sax.handler.MyHandler;
- public class SaxService {
- public SaxService() {
- }
- public static List<HashMap<String,String>> readXml(InputStream inputStream,String nodeName){
- //创建一个解析XML工厂对象
- SAXParserFactory spf = SAXParserFactory.newInstance();
- MyHandler myHandler = new MyHandler(nodeName);
- try {
- SAXParser parser = spf.newSAXParser();
- parser.parse(inputStream, myHandler);
- inputStream.close();
- } catch (ParserConfigurationException e) {
- e.printStackTrace();
- } catch (SAXException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- return myHandler.getList();
- }
- }
HttpUtils.java
- package com.sax.http;
- import java.io.IOException;
- import java.io.InputStream;
- import java.net.HttpURLConnection;
- import java.net.MalformedURLException;
- import java.net.URL;
- public class HttpUtils {
- public HttpUtils() {
- }
- public static InputStream getXML(String path){
- InputStream inputStream = null;
- try {
- URL url = new URL(path);
- HttpURLConnection conn = (HttpURLConnection)url.openConnection();
- conn.setConnectTimeout(3000);
- conn.setRequestMethod("GET");
- int code = conn.getResponseCode();
- if(code == 200){
- inputStream = conn.getInputStream();
- }
- } catch (MalformedURLException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- return inputStream;
- }
- }
Test.java
- package com.sax.test;
- import java.io.InputStream;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import com.sax.http.HttpUtils;
- import com.sax.service.SaxService;
- public class Test {
- public Test() {
- super();
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- String path = "http://192.168.56.1:8099/web/person.xml";
- InputStream inputStream = HttpUtils.getXML(path);
- List<HashMap<String,String>> list = SaxService.readXml(inputStream, "person");
- for(HashMap map:list){
- System.out.println(map.toString());
- }
- }
- }
这里访问的使用自己搭建的web工程下的一个xml,由于太简单不再给出代码。
|
【内容导航】 | |
第1页:使用SAX解析 | 第2页:使用PULL解析XML |
第3页:使用DOM解析XML |
评论暂时关闭