在网络上传输数据时最常用的格式有两种,XML和JSON,下面首先学一下如何解析XML格式的数据,JSON的解析可以参见我的博客(android基础---->JSON数据的解析)。解析XML 格式的数据其实也有挺多种方式的,本节中我们学习比较常用的两种,Pull解析和SAX 解析。

目录导航

  1. Pull解析的用法
  2. Pull解析的代码
  3. Sax解析的用法
  4. Sax解析的代码
  5. Sax与Pull的比较
  6. 友情链接

Pull解析的用法

一、我们常用的五个事件:

  • START DOCUMENT:文档开始时,解析器还没有读取任何数据
  • START_TAG:解析到标签开头
  • TEXT:解析到元素的内容
  • END_TAG:解析在标签的末尾
  • END_DOCUMENT:文档结束,之后不会再解析了

二、PULL解析的步骤:

  • 创建一个XMLPULL工厂实例:

  XmlPullParserFactory factory = XmlPullParserFactory.newInstance();

  • 不指定命名空间的话,将使用默认的解析器。若要改变命名空间,用setNamespaceAware()这个方法:

  factory.setNamespaceAware(true);

  • 创建一个解析的实例:

  XmlPullParser xpp = factory.newPullParser();

  • 解析输入的数据:

  xpp.setInput ( new FileReader (filename ) );

  • 接下来就可以根据不同的事件,做不同的解析处理:一般用next()方法去得到下一个事件

三、next()方法与nextToken()方法:

  • next()方法只能支持上述常用的5种事件:
  • nextToken()方法不但支持next()方法的事件,还额外支持:COMMENT, CDSECT, DOCDECL, ENTITY_REF, PROCESSING_INSTRUCTION, or IGNORABLE_WHITESPACE

Pull解析的代码

aaarticlea/png;base64,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" alt="" />

  • 我们在assets中创建了一个文件: linux.xml
<?xml version="1.0" encoding="utf-8"?>
<LOL>
<person>
<!-- 这里是盖伦的注释 -->
<name sex="man">盖伦</name>
<address>德玛西亚</address>
<say>我将带头冲锋</say>
</person>
<person>
<!-- 这里是亚索的注释 -->
<name sex="man">亚索</name>
<address>艾欧尼亚</address>
<say>死亡如风,常伴吾身</say>
</person>
<person>
<!-- 这里是瑞雯的注释 -->
<name sex="girl">瑞雯</name>
<address>诺克萨斯</address>
<say>战争与谋杀之间,潜藏着我们的心魇</say>
</person>
</LOL>
  • 在MainActivity.xml中定义一个方法,得到linux.xml文件的内容
// 得到xml的数据
private String getXMLData(String fileName) {
StringBuffer stringBuffer = new StringBuffer();
InputStream inputStream = null;
BufferedReader bufferedReader = null; try {
inputStream = getResources().getAssets().open(fileName);
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line = "";
while ((line = bufferedReader.readLine()) != null) {
stringBuffer.append(line + "\n");
}
bufferedReader.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
Log.i(TAG, stringBuffer.toString());
return stringBuffer.toString();
}
  • 定义一个方法,用PULL解析得到的数据:
// pull解析xml数据
public void pullParse(View view) {
String xmlData = getXMLData(fileName);
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlData));
int eventType = xmlPullParser.getEventType(); String name = "";
String address = "";
String say = "";
String sex = ""; while (eventType != XmlPullParser.END_DOCUMENT) {
String nodeName = xmlPullParser.getName();
switch (eventType) {
case XmlPullParser.START_TAG: {
if ("name".equals(nodeName)) {
// sex与name的位置不能互换
              // sex = xmlPullParser.getAttributeValue(0);
sex = xmlPullParser.getAttributeValue(null, "sex");
name = xmlPullParser.nextText();
} else if ("address".equals(nodeName)) {
address = xmlPullParser.nextText();
} else if ("say".equals(nodeName)) {
say = xmlPullParser.nextText();
}
break;
}
// 完成解析某个结点
case XmlPullParser.END_TAG: {
if ("person".equals(nodeName)) {
Log.d(TAG, "name: " + name);
Log.d(TAG, "address: " + address);
Log.d(TAG, "say: " + say);
Log.d(TAG, "sex: " + sex);
}
break;
}
default:
break;
}
eventType = xmlPullParser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
}
  • 若要解析到<!-- -->里面的注释内容,需要做以下的修改:增加case,修改next()方法为nextToken()方法:
// 增加一个case,用于接收注释的事件
case XmlPullParser.COMMENT: {
coment = xmlPullParser.getText();
break;
}
default:
break;
}
eventType = xmlPullParser.nextToken(); // 此处为修改部分
  • 打印日志如下:(增加了注释的功能)
03-16 18:09:59.662 24745-24745/com.example.linux.xmlparsetest D/MainActivity: name: 盖伦
03-16 18:09:59.662 24745-24745/com.example.linux.xmlparsetest D/MainActivity: address: 德玛西亚
03-16 18:09:59.662 24745-24745/com.example.linux.xmlparsetest D/MainActivity: say: 我将带头冲锋
03-16 18:09:59.662 24745-24745/com.example.linux.xmlparsetest D/MainActivity: sex: man
03-16 18:09:59.662 24745-24745/com.example.linux.xmlparsetest D/MainActivity: comment: 这里是盖伦的注释
03-16 18:09:59.662 24745-24745/com.example.linux.xmlparsetest D/MainActivity: name: 亚索
03-16 18:09:59.662 24745-24745/com.example.linux.xmlparsetest D/MainActivity: address: 艾欧尼亚
03-16 18:09:59.662 24745-24745/com.example.linux.xmlparsetest D/MainActivity: say: 死亡如风,常伴吾身
03-16 18:09:59.662 24745-24745/com.example.linux.xmlparsetest D/MainActivity: sex: man
03-16 18:09:59.662 24745-24745/com.example.linux.xmlparsetest D/MainActivity: comment: 这里是亚索的注释
03-16 18:09:59.662 24745-24745/com.example.linux.xmlparsetest D/MainActivity: name: 瑞雯
03-16 18:09:59.662 24745-24745/com.example.linux.xmlparsetest D/MainActivity: address: 诺克萨斯
03-16 18:09:59.662 24745-24745/com.example.linux.xmlparsetest D/MainActivity: say: 战争与谋杀之间,潜藏着我们的心魇
03-16 18:09:59.662 24745-24745/com.example.linux.xmlparsetest D/MainActivity: sex: girl
03-16 18:09:59.662 24745-24745/com.example.linux.xmlparsetest D/MainActivity: comment: 这里是瑞雯的注释

Sax解析的用法

一、 SAX解析的简要:

SAX:事件驱动型的XML解析方式。顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问,且是只读的。由于移动设备的内存资源有限,SAX的顺序读取方式更适合移动开发。

二、 SAX解析XML步骤:

  • 创建XML解析处理器。
  • 创建SAX解析器。
  • 将XML解析处理器分配给解析器。
  • 对文档进行解析,将每个事件发送给处理器。

三、SAX解析的过程:

  • 解析开始之前,需要向XMLReader注册一个ContentHandler,也就是相当于一个事件监听器,
  • 在ContentHandler中定义了很多方法,比如startDocument(),它定制了当在解析过程中,遇到文档开始时应该处理的事情。
  • 当 XMLReader读到合适的内容,就会抛出相应的事件,并把这个事件的处理权代理给ContentHandler,调用其相应的方法进行响应。

Sax解析的代码

  • 定义一个类ContentHandler,处理不同的事件:
package com.example.linux.xmlparsetest;

import android.util.Log;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; /**
* Created by Linux on 2016/3/16.
*/
public class ContentHandler extends DefaultHandler {
private final static String TAG = "MainActivity";
private String nodeName;
private StringBuilder name;
private StringBuilder address;
private StringBuilder say;private StringBuilder sex; // 文档开始时执行
@Override
public void startDocument() throws SAXException {
name = new StringBuilder();
address = new StringBuilder();
say = new StringBuilder();
sex = new StringBuilder();
coment = new StringBuilder();
} // 元素开始时执行
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// 记录当前结点名
nodeName = localName;
if (nodeName.equals("name") && attributes != null) {
sex.append(attributes.getValue("sex"));
}
} @Override
public void characters(char[] ch, int start, int length) throws SAXException {
// 根据当前的结点名判断将内容添加到哪一个StringBuilder对象中
if ("name".equals(nodeName)) {
name.append(ch, start, length);
} else if ("address".equals(nodeName)) {
address.append(ch, start, length);
} else if ("say".equals(nodeName)) {
say.append(ch, start, length);
}
} // 元素结束时执行
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("person".equals(localName)) {
Log.d(TAG, "name is " + name.toString().trim());
Log.d(TAG, "adress is " + address.toString().trim());
Log.d(TAG, "say is " + say.toString().trim());
Log.d(TAG, "sex is " + sex.toString().trim());
// 最后要将StringBuilder清空掉
name.setLength(0);
address.setLength(0);
say.setLength(0);
sex.setLength(0);
}
} // 文档结束时
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
}
  • 在MainActivity中定义方法,来进行SAX解析
// sax解析数据
public void saxParse(View view) {
String xmlData = getXMLData(fileName);
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
ContentHandler handler = new ContentHandler();
// 将ContentHandler的实例设置到XMLReader中
xmlReader.setContentHandler(handler);
// 开始执行解析
xmlReader.parse(new InputSource(new StringReader(xmlData)));
} catch (Exception e) {
e.printStackTrace();
}
}
  • 打印日志如下:
03-16 18:10:55.732 24745-24745/com.example.linux.xmlparsetest D/MainActivity: name is 盖伦
03-16 18:10:55.732 24745-24745/com.example.linux.xmlparsetest D/MainActivity: adress is 德玛西亚
03-16 18:10:55.732 24745-24745/com.example.linux.xmlparsetest D/MainActivity: say is 我将带头冲锋
03-16 18:10:55.732 24745-24745/com.example.linux.xmlparsetest D/MainActivity: sex is man
03-16 18:10:55.732 24745-24745/com.example.linux.xmlparsetest D/MainActivity: name is 亚索
03-16 18:10:55.732 24745-24745/com.example.linux.xmlparsetest D/MainActivity: adress is 艾欧尼亚
03-16 18:10:55.732 24745-24745/com.example.linux.xmlparsetest D/MainActivity: say is 死亡如风,常伴吾身
03-16 18:10:55.732 24745-24745/com.example.linux.xmlparsetest D/MainActivity: sex is man
03-16 18:10:55.732 24745-24745/com.example.linux.xmlparsetest D/MainActivity: name is 瑞雯
03-16 18:10:55.732 24745-24745/com.example.linux.xmlparsetest D/MainActivity: adress is 诺克萨斯
03-16 18:10:55.732 24745-24745/com.example.linux.xmlparsetest D/MainActivity: say is 战争与谋杀之间,潜藏着我们的心魇
03-16 18:10:55.732 24745-24745/com.example.linux.xmlparsetest D/MainActivity: sex is girl

Sax与Pull的比较

区别:

  • SAX解析器的工作方式是自动将事件推入注册的事件处理器进行处理,因此你不能控制事件的处理主动结束
  • PULL解析器的工作方式为允许你的应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析

相似性:

  Pull解析器也提供了类似SAX的事件,开始文档START_DOCUMENT和结束文档END_DOCUMENT,开始元素START_TAG和结束元素END_TAG,遇到元素内容TEXT等,但需要调用next() 方法提取它们(主动提取事件)。

使用:

  如果在一个XML文档中我们只需要前面一部分数据,但是使用SAX方式或DOM方式会对整个文档进行解析,尽管XML文档中后面的大部分数据我们其实都不需要解析,因此这样实际上就浪费了处理资源。使用PULL方式正合适。

友情链接

至于SAX解析能不能解析到注释的内容,不知道各位有没有结果?

android基础---->XMl数据的解析的更多相关文章

  1. android基础---->JSON数据的解析

    上篇博客,我们谈到了XML两种常用的解析技术,详细可以参见我的博客(android基础---->XMl数据的解析).网络传输另外一种数据格式JSON就是我们今天要讲的,它是比XML体积更小的数据 ...

  2. XML数据的解析

    XML数据的解析 相比于JSON数据解析而言,XML数据解析可能会让更多的童鞋感觉到吃力,对我来说,同样认为JSON数据好像让人感觉比较友好,不过对于程序开发者来说,无非就是这两种数据解析占比较大的部 ...

  3. Android 之XML数据解析(2)—— SAX解析

    (以下文章基本照抄郭霖大神的<第一行代码>) 在Android之 解析XML文件(1)—— Pull解析 中我们讲了Pull方式解析XML文件.今天讲另外一种方式,SAX解析XML文件. ...

  4. 一起学Android之Xml与Json解析

    概述 在网络中,数据交互通常是以XML和Json的格式进行,所以对这两种格式的数据进行解析,是Android开发中的必备功能,本文以一个简单的小例子,简述Android开发中Xml和Json解析的常用 ...

  5. iOS开发网络篇—XML数据的解析

     iOS开发网络篇—XML数据的解析 iOS开发网络篇—XML介绍 一.XML简单介绍 XML:全称是Extensible Markup Language,译作“可扩展标记语言” 跟JSON一样,也是 ...

  6. json和xml数据的解析

    一 json数据 1一条json就像一个对象,也想像OC中的数组,且内嵌了很多键值对字典 {"name" : "jack", "age" : ...

  7. Android 之 json数据的解析(jsonReader)

    json数据的解析相对而言,还是比较容易的,实现的代码也十分简单.这里用的是jsonReade方法来进行json数据解析. 1.在解析之前,大家需要知道什么是json数据. json数据存储的对象是无 ...

  8. Android之XML序列化和解析

    XML文件是一种常用的文件格式,可以用来存储与传递数据 ,本文是XML文件序列化与解析的一个简单示例 写文件到本地,并用XML格式存储 /** * 写xml文件到本地 */ private void ...

  9. 多线程与网络之JSON和XML数据的解析

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

随机推荐

  1. CentOS 6.8 安装 Erlang 及 RabbitMQ Server

    安装 Erlang 19.3 # 安装依赖包 yum install -y gcc gcc-c++ unixODBC-devel openssl-devel ncurses-devel # 下载 er ...

  2. springboot之启动原理解析及源码阅读

    前言 SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏.所以这次博主就跟你们一起一步步揭开SpringBoot的神秘面 ...

  3. 推荐一款在线编辑JSON的网站

    推荐一款在线编辑JSON的网站 https://github.com/DavidDurman/FlexiJsonEditor 开源地址:https://github.com/DavidDurman/F ...

  4. Android 如何保持屏幕常亮

    确认应用需要像游戏或者视频应用一样保持屏幕处于开启状态.最好的方式是在Activity中使用FLAG_KEEP_SCREEN_ON.(and only in an activity, never in ...

  5. 【Mac使用系列】Mac锁屏及快捷键

    mac锁屏办法,我有所尝试,可用系统自带锁屏快捷键:Ctrl + Command + Q或者参考方法2,直接设置TouchBar. 这两种办法,亲测可用.我直接设置了TouchBar,锁屏解锁离得很近 ...

  6. ShardedJedisPool的使用

    package com.test; import java.util.ArrayList; import java.util.List; import redis.clients.jedis.Jedi ...

  7. 赋值文件夹名称为日期的doc命令

    copy D:\111.txt d:\%date:~0,4%年%date:~5,2%月%date:~8,2%日.*

  8. Django-基础-2-ORM

    参考文章: http://www.cnblogs.com/haiyan123/p/7732190.html https://www.cnblogs.com/liuqingzheng/articles/ ...

  9. Cacti 1.1.6 添加monitor和thold插件

    以前一直使用0.8版本的cacti,最近升级到1.1.6之后,发现以前0.8用的插件已经不适用了,需要下载新的插件包进行导入到下面网址获取Cacti插件包https://github.com/Cact ...

  10. [svc]rsync简单部署

    安装rsync服务端-backup服务器 yum install rsync -y useradd rsync -s /sbin/nologin -M chown -R rsync.rsync /da ...