一、在Android应用中的XML文件来源

1、本地xml文件
    本地XML文件可以放在应用根目录assets文件夹、res/xml、res/raw、SDcard卡、应用的data目录等;
除res/xml可直接通过getXml(int id)获取XML文档,返回一个解析器对象(XmlResourceParer:XmlResourceParer是XmlPullParser的子类),其它位置情况都可以获取XML文档,返回一个Inputstream对象,进行读取数据,获取方法分别如下:
a.在res/xml目录下(推荐使用):
  1. XmlResourceParser xmlParser = this.getResources().getXml(R.xml.XXX);

b.在res/xml、res/raw目录下:

  1. InputStream inputStream = this.getResources().openRawResource(R.xml.XXX);
c.在assets文件夹下(本人测试发现通过此方法获取的XML文档不能带有首行:<?xml version="1.0" encoding="utf-8"?>,否则解析报错,具体原因未查明,知道原因请回复交流):
  1. InputStream inputStream = getResources().getAssets().open(fileName);

d.在应用指定目录下(SDcard,应用data目录等):

  1. // path路径根据实际项目修改,此次获取SDcard根目录
  2. String path = Environment.getExternalStorageDirectory().toString();
  3. File xmlFlie = new File(path+fileName);
  4. InputStream inputStream = new FileInputStream(xmlFlie);

二、应用

1.获取XmlPullParser对象

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();//先获取XmlPullParserFactory实例
XmlPullParser xmlPullParser = factory.newPullParser();//利用XmlPullParserFactory对象获取XmlPullParser对象

2.载入文件并解析的原理

/*载入文件*/
String s = "xml文档数据";
StringReader sr = new StringReader(s);//将数据转换成流
xmlPullParser.setInput(sr);//将数据放入XmlPullParser对象进行解析

解析原理:

就像有根手指放在文档上,逐步处理START_TAG,END_TAG和END_DOCUENT不同的XML节点事件。

START_TAG:当手指放在标签的头部时

END_TAG:当手指放在标签的尾部时

END_DOCUMENT:当手指到达文章的尾部的时候

3.进行解析并获取解析数据

XmlPullParser解析有几个主要方法(属性值:<div id="" name="">节点的内容</div>   id and name就是节点属性值。。。 )

a.XmlPullParser.getEventType() : 【获取当前事件回调类型】
b.XmlPullParser.getName():【获取当前节点名字】
c.XmlPullParser.getAttributeValue(int index):【根据id获取节点属性值】
d.XmlPullParser.getAttributeValue(String namespace, String name):【根据name获取节点属性值】
注解:namespace
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <persons
  3. xmlns:yd="http://www.china-mobile.com"
  4. xmlns:lt="http://www.china-unicome.com">
  5. some_content
  6. <person index="1">
  7. <name>yuanzhifei89</name><age>100</age><married>false</married>
  8. <!-- 移动号码 --><yd:phone yd:id="amj08102">12345678</yd:phone>
  9. <!-- 联通号码 --><lt:phone lt:id="cmk35203">87654321</lt:phone>
  10. Namespace的作用:两个都是phone类型的标签,所以需要指定namespace来确定。
  11. <![CDATA[&lt;&gt; <div>]]>&lt;
  12. </person>
  13. </persons>
e.XmlPullParser.nextText():【在回调节点START_TAG时,通过此方法获取节点全部内容】
 
XmlPullParser移动“手指”的方法:parser.next();
 

4.实例

private static final String XML_PEOPLE = "people";

public void parseItems(String xmlData){
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();//创建Xml工厂
XmlPullParser parser = factory.newParser();//创建Xml解析器
StringReader sr = new StringReader(xmlData);//将xml数据转换成reader流
parser.setInput(sr);//将数据放入解析器
int eventType = parser.next();//指针下移,获取回调事件类型
While(eventType != XmlPullParser.END_DOCUMENT){ //得到xml数据最后退出循环
if (eventType == XmlPullParser.START_TAG && XML_PEOPLE.equals(parser.getName())){//事件为文章头部并且标签名为需要标签
String name = parser.getAttributeValue(null,"name")//没有namespace就填null,获取属性为name的值
String weight = parser.getAttributeValue(nuill,"weight")//获取属性为weight的值
}
eventType = parser.next();//指针下移
}
}
 

XML_PULL解析的更多相关文章

  1. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  2. .NET Core中的认证管理解析

    .NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...

  3. Html Agility Pack 解析Html

    Hello 好久不见 哈哈,今天给大家分享一个解析Html的类库 Html Agility Pack.这个适用于想获取某网页里面的部分内容.今天就拿我的Csdn的博客列表来举例. 打开页面  用Fir ...

  4. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  5. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  6. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  7. Asp.Net WebApi核心对象解析(下篇)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  8. 【知识必备】内存泄漏全解析,从此拒绝ANR,让OOM远离你的身边,跟内存泄漏say byebye

    一.写在前面 对于C++来说,内存泄漏就是new出来的对象没有delete,俗称野指针:而对于java来说,就是new出来的Object放在Heap上无法被GC回收:而这里就把我之前的一篇内存泄漏的总 ...

  9. SQL Server 数据加密功能解析

    SQL Server 数据加密功能解析 转载自: 腾云阁 https://www.qcloud.com/community/article/194 数据加密是数据库被破解.物理介质被盗.备份被窃取的最 ...

随机推荐

  1. JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释

    以下内容转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29632145&id=4616836 jvm区域总体分两 ...

  2. Debian 使用杂记(一)

    前几天又冲动的把系统换成Linux了,最开始接触Linux是2010年,那时候买了个本本,预装的是ubuntu8.10,自此知道除了windows原来还有其它操作系统. 不记得什么时候开始知道ubun ...

  3. 关于twitter的GIF变mp4的测试

    这个事是好久之前听说了,今天FQ的时候突然想起来了,就去测试了一下这个gif转MP4到底有多神奇... 这个是我的twitter地址:https://twitter.com/chendatony31 ...

  4. thinkphp框架开启页面gzip压缩

    Thinkphp下开启gzip压缩很简单,不管你是哪个版本,只要在你的入口文件index.PHP中加入以下两行,如果你的服务器支持,那么就OK了. define ( "GZIP_ENABLE ...

  5. Amzon MWS API开发之 请求报告

    时间一晃而过又过了两周,博客园更新的速度确实有点慢,今天我要分享的是对请求报告的调用. 在文档中,相信大家也看了下面这个流程图吧? 相关流程,在文档中也有细说,我就不一一去Copy了:http://d ...

  6. android的注意点

    1.使用Message.callback Message msg = Message.obtain(myThreadHandler,new Runnable() { @Override public  ...

  7. 如何测试一个U盘

    功能测试: 1 在windows xp比较流行的操作系统上是否可以识别(装了驱动后是否可以) 2 在电脑上显示的盘符是否正确 3 总空间,可用空间,已用空间是否显示正确 4 u盘中是否可以拷入各种格式 ...

  8. codevs1039 数的划分

    题目描述 Description 将整数n分成k份,且每份不能为空,任意两种划分方案不能相同(不考虑顺序). 例如:n=7,k=3,下面三种划分方案被认为是相同的. 1 1 5 1 5 1 5 1 1 ...

  9. PHP内核学习(一)SAPI

    学习PHP-src之前,我准备了一份源文件: GitHub下载->https://github.com/helingfeng/php-src 简单分析一下源码的目录结构: 1. root根目录下 ...

  10. 【LeetCode练习题】Add Two Numbers

    链表相加 You are given two linked lists representing two non-negative numbers. The digits are stored in ...