Android对XML文件解析

HTTP网络传输中的数据组织方式有三种方式:

1、HTML方式

2、XML方式

3、JSON方式

XML的结构解析如下:

1、节点

2、元素

3、属性和属性值

由于XML的扩展性强,致使它需要有稳定的基础规则来支持扩展,该语法规则是:

1、开始和结束标签匹配

2、嵌套标签不能互相嵌套

3、区分大小写

Android中,解析Xml数据的三种方式:

1、DOM(org.w3c.dom)

“文档对象模型”方式,解析完的Xml将生成一个树状结构的对象。

2、SAX(org.xml.sax)

Simple API for XML,以事件的形式通知程序,对Xml进行解析。

3、XMLPULL(org.xmlpull.v1)

类似于SAX方式,程序以“拉取”的方式对Xml进行解析。

SAX技术的介绍

SAX是一种以事件驱动的XML api,由它定义的事件流可以指定从解析器传到专门的处理程序的代码的XML结构,简单的讲,它解析速度快,占用内存少的解析器。这种解析器比较适合android 等移动设备。

使用SAX的优点是:

因为SAX的优势是流的方式处理,当遇到一个标签的时候,并不会记录下当前所碰到的标签。

也就是说,startEelment方法中,你所知道的信息,仅仅是当前的签名的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元素与其他结构相关的信息,都是不知道的。

DOM技术的介绍

DOM是一种用于XML文档对象模型,可用于直接访问XML文档的各个部位,在DOM中文档被模拟为树状,其中XML语法的每一个组成部分都表示一个节点,DOM允许用户遍历文档树,从父节点移动到子节点和兄弟节点。并利用某节点类型特有的属性(元素具有属性,文本节点具有文本数据)

节点(XML文档中的每一个成分都是一个节点)

DOM是这样规定的:

整个文档是一个节点文档

每一个XML标签是一个元素节点

包含在XML元素中的文本是文本节点

每一个XML属性是一个属性节点

PULL技术的介绍

除了可以使用以上两种解析XML文件之外,我们也可以使用Java自带的PULL来解析XML文件。

PULL解析器的运行方式和sax解析器很相似,它提供了类似的事件。

如开始元素和结束元素,使用parser.next()可以进行下一个元素并且触发相应的事件,事件将作为代码被发送,因此可以使用一个switch来对事件进行选择,然后进行相应的处理。当开始解析元素时候,调用parser.nextText()方法可以获得下一个Text类型的元素。

PULL特点:

简单的结构:一个接口,一个例外,一个工厂组成的PULL解析器

简单易用:PULL解析器只有一个重要的方法next方法,他被用来检索下一个事件,而它只有5个常用的属性:

START DOCUMENT

START_TAG

TEXT

END_TAG

END_DOCUMENT

从内存占用率来说:

SAX和PULL比DOM占用的更少的内存解析方式,更加适合Android 手机开发。


下面举代码例子说明一下SAX的使用方法:

MyHandle.java

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) {
		// TODO Auto-generated constructor stub
		this.nodeName = nodeName;
	}

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

	@Override
	public void startDocument() throws SAXException {
		// TODO Auto-generated method stub
		// 当读到第一个开始标签的时候,会触发这个方法
		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 {
		// TODO Auto-generated method stub
		// 这个方法是用来处理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 {
		// TODO Auto-generated method stub
		// 遇到结束标记的时候,会调用这个方法
		if (qName.equals(nodeName)) {
			list.add(map);
			map = null;
		}
		super.endElement(uri, localName, qName);
	}
}

SaxService.java

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() {
        // TODO Auto-generated constructor stub
    }

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) {
            // TODO: handle exception
        }
        return null;
    }
}

HttpUtil.java

package com.sax.http;

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

public class HttpUtils {

public HttpUtils() {
        // TODO Auto-generated constructor stub
    }

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) {
            // TODO: handle exception
        }
        return inputStream;
    }
}

test.java  ->main

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() {
        // TODO Auto-generated constructor stub
    }

/**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        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) {
            // TODO: handle exception
        }
    }

}

时间: 2024-10-09 19:29:17

Android对XML文件解析的相关文章

android之XML文件解析 -- SAX

xml文件解析之SAX 下面的实例代码主要采用的是SAX事件驱动处理机制来解析XML文件,SAX解析XML是通过逐行扫描的方式完成的,占用内存小.dom机制是将文件全部读出,然后再以树结构的形式,来完成查找.删除等操作,对内存占用较大 MyContentHandler.java     此文件是事件处理器实现 package com.example.analysisxml; import org.xml.sax.Attributes; import org.xml.sax.SAXExceptio

android基础知识13:AndroidManifest.xml文件解析

1.重要性 AndroidManifest.xml是Android应用程序中最重要的文件之一.它是Android程序的全局配置文件,是每个 android程序中必须的文件.它位于我们开发的应用程序的根目录下,描述了package中的全局数据,包括package中暴露的组件 (activities, services, 等等),以及他们各自的实现类,各种能被处理的数据和启动位置等重要信息. 因此,该文件提供了Android系统所需要的关于该应用程序的必要信息,即在该应用程序的任何代码运行之前系统所

八、Android学习第七天——XML文件解析方法(转)

(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:extensible markup language 定义:用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 解析XML的方式: SAX——Simple API for XML,既是一种接口,也是一个软件包采用的是事件驱动,也就是它解析

Android进阶之XML文件解析

xml序列化是把内存数据写入硬盘或SD卡. XML文件解析的方式: 1.dom解析,生成一个树状结构,并全部加入内存,在内存修改树状结构的节点即可.但是消耗内存大. 2.sax解析 基于事件的解析方式.速度快,效率高,但是不能倒退. 3.pull解析 基于事件的解析 pull解析方式: 第一步,初始化解析器,设置要解析的数据流.(此刻指向文档的开始部分) 第二步,得到事件. 第三步,总的节点集合. 第四步,单个节点. public class PullXMLTools { public Pull

(Android review)XML的解析与序列化

这篇博客主要用来介绍对XML文件的操作:解析与生成. Android手机内部的解析就是pull解析官网:http://xmlpull.org/所谓的解析,我们可以理解为:利用XML文件的内容来生成一个对象导出生成的xml文件后不要对其格式化,否则会出异常 1.MainActivity package com.example.xmlparsertest1; import android.os.Bundle; import android.app.Activity; import android.v

Android中XML数据解析

转载请注明出处:http://blog.csdn.net/yegongheng/article/details/38296207 XML初步 今天我们来学习另一种非常重要的数据交换格式-XML.XML(Extensible Markup Language的缩写,意为可扩展的标记语言),它是一种元标记语言,即定义了用于定义其他特定领域有关语义的.结构化的标记语言,这些标记语言将文档分成许多部件并对这些部件加以标识.XML 文档定义方式有:文档类型定义(DTD)和XML Schema.DTD定义了文

Android修改XML文件

最近在项目中需要使用XML记录数据,网上这方面的文章较少,记录一下 使用DOM方式 [java] view plaincopy /** * 追加内容到XML文档 * @param instructions * @throws ParserConfigurationException * @throws SAXException * @throws IOException * @throws TransformerException */ public void append2XML(String

XML文件解析【安卓7】——SAX解析

XML文件解析 XML解析:XML技术是Android平台的应用基础,  Android提供了多种解析XML的方式:SAX解析.DOM解析.PULL解析 SAX解析 SAX --Simple  API  forXML  (XML简单的API) --解析速度快.占用内存少 --提供一组简单的API用于解析XML文件 --SAX在解析XML文件前,先指定一个解析事件处理器(Handler),SAX会对XML文档进行简单的顺序扫描,当扫描到[文档(Document)的开始和结束.元素(Element)

JAVA之XML文件解析

在Java.Android开发中,xml文件的解析很重要.本人使用过的xml文件解析的方式有两种,一种是DOM文档解析.还有一种是SAX. DOM是基于文档树结构的.SAX是基于事件驱动的.SAX则是遇到标签则触发工作的.当解析器发现元素开始.元素结束.文本.文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据.优缺点很明显:DOM对于大型文件的操作不好(因为它要先读入整个文档到内存中),SAX为了解决这样问题.不用事先调入整个文档,占用资源少:SAX解析器代码比DOM解析器代