【Android学习】XML文本的三种解析方式(通过搭建本地的Web项目提供XML文件)
XML为一种可扩展的标记语言,是一种简单的数据存储语言,使用一系列简单的标记来描述。
一、SAX解析
即Simple API for XML,以事件的形式通知程序,对Xml进行解析。
1、首先在Web项目中发布一个XML文档,名字为persons.xml,具体内容为:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="">
<name>周杰伦</name>
<age></age>
</person>
<person id="">
<name>小明</name>
<age></age>
</person> </persons>
2、SAX解析的流程主要如下:
通过创建SAXParserFactory对象获得一个实例,然后再通过工厂获得一个SaxParser,依靠SaxParser的parse方法,完成解析,其中parse方法的参数为一个InputStream类和一个DefaultHandler类,defaultHandler需 要重写
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser parse = spf.newSAXParser();
Myhandler handler = new Myhandler("person");
parse.parse(is, handler);
list = handler.getList();
3、重写处理类DefaultHandler。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; public class Myhandler extends DefaultHandler { List<HashMap<String, String>> list = null;// 存储所有的解析对象
String currentTag = null; // 正在解析的标签
String currentValue = null; // 正在解析元素的值
String nodename = null; // 正在解析节点名称
HashMap<String, String> map = 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 endElement(String uri, String localName, String qName)
throws SAXException {
if (qName.equals(nodename)) {
list.add(map);
map = null;
}
super.endElement(uri, localName, qName);
} @Override
// 处理xml文件读取到的内容
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;
} }
4、通过自定义的HttpUtils类,从服务器获取数据,以流的形式返回,也就是XML文档的输入流,这里不再给出,关于获得服务器数据的三种方式下次会下次更新。
5、最后通过返回的List<Map<String,String>> 获得了XML文档的所需要的内容,需要提到的是,我在这里是需要解析person节点,于是只有qName等于person时候才会开始解析。
二、PULL解析
类似于SAX方式,程序以“拉取”的方式对Xml进行解析。
1、与SAX解析类似,但比SAX解析容易,需要JAR包,下载地址:
2、首先通过XMLPullFactory创建一个工厂,然后再由工厂创建一个XMLPullParser对象,由对象进行相关处理。
3、通过对eventType进行XML文件的节点解析,获得数据,并存放在List中进行返回。
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory; public class PullXmlHandler { public static List<Person> parseXml(InputStream is, String encode)
throws Exception {
List<Person> list = null;
Person p = null;
try {
XmlPullParserFactory xmlPullF = XmlPullParserFactory.newInstance();
XmlPullParser parser = xmlPullF.newPullParser();
parser.setInput(is, encode);
int eventType = parser.getEventType();
//如果还没到文档结束节点就一直循环
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
list = new ArrayList<Person>();
break; case XmlPullParser.START_TAG:
if (parser.getName().equals("person")) {
p = new Person();
if (parser.getAttributeCount() != 0) {
p.setId(parser.getAttributeValue(0));
}
} else if (parser.getName().equals("name")) {
p.setName(parser.nextText());
} else if (parser.getName().equals("age")) {
p.setAge(parser.nextText());
}
break;
case XmlPullParser.END_TAG:
if (parser.getName().equals("person")) {
list.add(p);
p = null;
}
break;
default:
break;
}
//进行下次循环
eventType = parser.next(); }
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
} }
三、DOM解析
“文档对象模型”方式,解析完的Xml将生成一个树状结构的对象。
1、DOM解析相对前两种比较麻烦,代码如下:
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList; import com.xml.httputils.http_post; public class DomService { public DomService() {
} public static List<Person> parseXML(InputStream is) throws Exception {
List<Person> list = new ArrayList<Person>();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(is);
// 获得节点
Element element = document.getDocumentElement();
NodeList nodeList = element.getElementsByTagName("person");
for (int i = ; i < nodeList.getLength(); i++) {
Element personElement = (Element) nodeList.item(i);
Person p = new Person();
p.setId(personElement.getAttribute("id"));
NodeList personList = personElement.getChildNodes();
for (int j = ; j < personList.getLength(); j++) {
if (personList.item(j).getNodeType() == Node.ELEMENT_NODE) {
if ("name".equals(personList.item(j).getNodeName())) {
p.setName(personList.item(j).getFirstChild()
.getNodeValue());
} else if ("age".equals(personList.item(j).getNodeName())) {
p.setAge(personList.item(j).getFirstChild()
.getNodeValue());
}
}
}
list.add(p);
}
return list; } public static void main(String[] args) throws Exception {
DomService dom = new DomService();
List<Person> ps = dom.parseXML(http_post.getXMLStream());
for (Person p : ps) {
System.out.println(p);
}
}
}
总结:
对于小内存的设备,尤其是Android设备,使用PULL解析或者SAX解析远优于DOM解析。
【Android学习】XML文本的三种解析方式(通过搭建本地的Web项目提供XML文件)的更多相关文章
- Android平台中实现对XML的三种解析方式
本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...
- JSON的三种解析方式
一.什么是JSON? JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度. JSON就是一串字符串 只不过元素会使用特定 ...
- Spring学习日记01_IOC_xml的三种注入方式
什么是IOC 控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理 使用IOC目的:为了耦合度降低 做入门案例就是IOC实现 IOC底层原理 xml解析 工厂模式 反射 原始方式 cla ...
- Javaweb学习笔记——(六)——————xml中jaxp两种解析方式和dom4j运用
1.xml的scheam约束 dtd的语法:<!ElEMENT 元素名称 约束> **schema符合xml的语法,xml语句 **一个xml中可以有多个schema,多个schema使用 ...
- python爬虫之数据的三种解析方式
一.正则解析 单字符: . : 除换行以外所有字符 [] :[aoe] [a-w] 匹配集合中任意一个字符 \d :数字 [0-9] \D : 非数字 \w :数字.字母.下划线.中文 \W : 非\ ...
- Android 沉浸式状态栏的三种实现方式
沉浸式状态栏 Google从android kitkat(Android 4.4)開始,给我们开发人员提供了一套能透明的系统ui样式给状态栏和导航栏,这种话就不用向曾经那样每天面对着黑乎乎的上下两条黑 ...
- 爬虫的三种解析方式(正则解析, xpath解析, bs4解析)
一 : 正则解析 : 常用正则回顾: 单字符: . : 除换行符以外的所有字符 [] : [aoe] [a-w] 匹配集合中任意一个字符 \d : 数字 [0-9] \D : 非数字 \w : 非数字 ...
- Android开发——View滑动的三种实现方式
0. 前言 Android开发中,我们常常需要View滑动实现一些绚丽的效果来优化用户体验.一般View的滑动可以用三种方式实现. 转载请注明出处:http://blog.csdn.net/seu ...
- Java开发学习(四)----bean的三种实例化方式
一.环境准备 准备开发环境 创建一个Maven项目 pom.xml添加依赖 resources下添加spring的配置文件applicationContext.xml 最终项目的结构如下: 二. ...
随机推荐
- ubuntu安装redis
1.下载安装root@21ebdf03a086:/# apt-cache search redisroot@21ebdf03a086:/# apt-get install redis-server a ...
- js操作textarea方法集合
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- Java程序员的日常—— Properties文件的读写
在日常的Java程序开发中,Properties文件的读写是很常用的.经常有开发系统通过properties文件来当做配置文件,方便用户对系统参数进行调整. 那么本片就来简单的介绍下,如何使用Prop ...
- 【Android】应用程序Activity启动过程分析
在Android系统中,有两种操作会引发Activity的启动,一种用户点击应用程序图标时,Launcher会为我们启动应用程序的主Activity:应用程序的默认Activity启动起来后,它又可以 ...
- Atitit.常用的gc算法
Atitit.常用的gc算法 1.1. 记-清除算法1 1.2. 复制算法1 1.3. 标记-整理算法2 1.4. 分代收集算法2 1.1. 记-清除算法 最基础的收集算法,算法分为标记和清除两个阶段 ...
- Atitit.java c++指针使用总结O7
Atitit.java c++指针使用总结O7 1. 指针的本质 1 2. 指针的作用 1 1. 提升性能问题这常常用于遍历数组, 1 2. 计算两个指针的的距离 2 3. 避免栈溢出,创建动态数据结 ...
- 24单行插入与批量插入-insert(必学)-天轰穿sqlserver视频教程
大纲:insert语句,简单插入数据与批量插入数据 为了冲优酷的访问量,所以这里只放优酷的地址了,其实其他网站还是都传了的哈. 代码下载http://www.cnthc.com/?/article/1 ...
- [UWP]一种利用Behavior 将StateTrigger集中管理的方案
不做开篇废话,我们发现: AdaptiveTrigger 不够好 我们知道,UWP可以在一个页面适应不同尺寸比例的屏幕.一般来说这个功能是通过官方推荐的AdaptiveTrigger 进行的. 比如这 ...
- WPF与winform与silverlight的区别
收到了一封学生的邮件: =========================== 金老师您好: 最近在学C#.NET,基本语法学习的差不多了,接下来准备学习图形界面设计部分.但是我目前对于.NET的Wi ...
- Scala 并行和并发编程-Futures 和 Promises【翻译】
官网地址 本文内容 简介 Futures 阻塞 异常 Promises 工具 最近看了<七周七语言:理解多种编程泛型>,介绍了七种语言(四种编程范型)的主要特性:基本语法,集合,并行/并发 ...