安卓和JAVA解析xml文件的三种方式:

1、PULL解析

2、SAX解析

3、DOM解析

三者各有所长,依情况选择解析方式

1、PULL和SAX均采用流式解析,意味着只能从头读到底,无法像DOM解析一样随机访问xml文件中的任意一个节点

2、PULL和SAX占用更少的内存解析,更适用于安卓上的解析xml文件

3、DOM解析时将文件全部解析完,最后让用户任意取特定的信息

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面学习PULL解析方式。(PULL方法的简洁性是它最大的优势)

1、解析本地xml文件

  public class PullParser {

      public List<Worker> pullParsers() throws XmlPullParserException, IOException
{
List<Worker> list = null;
Worker worker = null;
//第一步:创建XML解析对象,需要通过工厂模式创建类的实例
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
// 第二步:设置待解析的xml数据源
FileInputStream fis = new FileInputStream("worker.xml");
parser.setInput(fis,"utf-8");
// 第三步:获取当前xml标签的事件类型
int event = parser.getEventType();
// 第四步:通过分支语句处理不同的事件标签
while(event!=XmlPullParser.END_DOCUMENT)
{ switch(event)
{
// 第五步:获取标签名称,处理标签信息
case XmlPullParser.START_DOCUMENT://解析文件开始,创建列表集合对象
list = new ArrayList<Worker>();
break;
case XmlPullParser.START_TAG:
String tagName = parser.getName();
if("worker".equals(tagName))
{
worker = new Worker();
int count = parser.getAttributeCount();//得到属性的个数
for(int i=;i<count;i++)
{
String attrName = parser.getAttributeName(i);
String attrValue = parser.getAttributeValue(i);
if("id".equals(attrName))
worker.setId(attrValue);
}
}
else if("name".equals(tagName))
worker.setName(parser.nextText());
worker.setMoney(Double.parseDouble(parser.nextText()));
break; case XmlPullParser.END_TAG://解析文件结束,
if("worker".equals(parser.getName()))
{
// 第六步:将处理的数据保存到JavaBean或Map对象中
list.add(worker);
worker = null;
}
break;
}
// 第七步:获取下一个标签的事件类型,判断事件类型是否为文档结束事件,如果是则退出,反之重复第四、五、六步
event = parser.next();
}
return list;
} /**
60 * @param args
61 * @throws IOException
62 * @throws XmlPullParserException
63 */
public static void main(String[] args) throws XmlPullParserException, IOException {
PullParser pullParser = new PullParser();
List<Worker> list = pullParser.pullParsers(); for(Worker w:list)
{
System.out.println(w);
}
} }

Demo

 <?xml version="1.0" encoding="UTF-8"?>
<workers>
<worker id="AQ01">
<name>Mark</name>
</worker>
<worker id="AD02">
<name>Luch</name>
</worker>
<worker id="AD03">
<name>Lily</name>
</worker>
<worker id="AD04">
<name>Lily</name>
</worker>
</workers>

xml文件

 package com.qianfeng.pullparser2;

 public class Worker {

     private String id;
private String name; public Worker() {
super();
// TODO Auto-generated constructor stub
}
public Worker(String id, String name) {
super();
this.id = id;
this.name = name; }
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "Worker [id=" + id + ", name=" + name + "]";
}
}

Worker.class 对象类

解析效果:

 Worker [id=AQ01, name=Mark]
Worker [id=AD02, name=Luch]
Worker [id=AD03, name=Lily]
Worker [id=AD04, name=Lily]

控制台信息

2、解析服务器的xml文件

 package pull;

 import java.io.IOException;
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 Pull { /**
* @param args
* @throws XmlPullParserException
* @throws IOException
*/
public static void main(String[] args) throws XmlPullParserException, IOException {
// TODO Auto-generated method stub
List<Person> list = null;
Person person=null; XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
String path ="http://localhost:8080/aaa/person.xml";
InputStream in = HttpUtil.getInputStream(path);
parser.setInput(in, "utf-8");
int event = parser.getEventType();
while(event!=XmlPullParser.END_DOCUMENT)
{
switch(event)
{
case XmlPullParser.START_DOCUMENT:
System.out.println("文件解析开始");
list = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG:
String str = parser.getName();
if("person".equals(str))
{
person = new Person();
int count = parser.getAttributeCount();
for(int i=;i<count;i++)
{
String key = parser.getAttributeName(i);
String value = parser.getAttributeValue(i);
if("id".equals(key))
{
person.setName(value);
}
}
}
else if("name".equals(str))
{
person.setName(parser.nextText());
}
break;
case XmlPullParser.END_TAG:
if("person".equals(parser.getName()))
{
list.add(person);
person=null;
}
break;
}
event = parser.next(); } for(int i=;i<list.size();i++)
{
System.out.println(list);
} } }

对应的HttpUtil自定义类getInpustStream方法

 package pull;

 import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL; public class HttpUtil {
public static InputStream getInputStream(String path) throws IOException{
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout();
conn.setDoInput(true);
if(conn.getResponseCode() ==)
{
InputStream in = conn.getInputStream();
return in;
} return null; } }

HttpHtil.java

解析效果:

 文件解析开始
[Pserson [id=, name=张老师, age=], Pserson [id=, name=李老师, age=]]
[Pserson [id=, name=张老师, age=], Pserson [id=, name=李老师, age=]]

控制台信息

Java数据解析---PULL的更多相关文章

  1. Java数据解析---JSON

    一.Java数据解析分为:XML解析和JSON解析 XML解析即是对XML文件中的数据解析,而JSON解析即对规定形式的数据解析,比XML解析更加方便 JSON解析基于两种结构: 1.键值对类型 { ...

  2. Java数据解析之JSON

    文章大纲 一.JSON介绍二.常见框架介绍与实战三.Studio中GsonFormat插件使用四.项目源码下载(含参考资料)五.参考文档   一.JSON介绍 1. 简介   JSON 的全称是 Ja ...

  3. Java数据解析之XML

    文章大纲 一.XML解析介绍二.Java中XML解析介绍三.XML解析实战四.项目源码下载   一.XML解析介绍   最基础的XML解析方式有DOM和SAX,DOM和SAX是与平台无关的官方解析方式 ...

  4. Java数据解析---SAX

    一.Sax解析 是从头到尾逐行逐个元素读取内容,修改较为不便,但适用于只读的大文档. Sax采用事件驱动的方式解析文档.简单点说,如同在电影院看电影一样,从头到尾看一遍就完了,不能回退(Dom可来来回 ...

  5. json-lib-2.4-jdk15.jar所需全部JAR包.rar java jsoup解析开彩网api接口json数据实例

    json-lib-2.4-jdk15.jar所需全部JAR包.rar  java jsoup解析开彩网api接口json数据实例 json-lib-2.4-jdk15.jar所需全部JAR包.rar  ...

  6. 暚光科技定位系统数据解析-java

    暚光科技定位系统数据解析-java package com.ygkj.test; import java.io.DataInputStream; import java.io.IOException; ...

  7. android基础(五)网络数据解析方法

    在网络上传输数据时最常用的方法有两种:XML和JSON,下面就对这两种类型的数据解析进行讲解. 一.XML数据解析 在Android中,常见的XML解析器分别为SAX解析器.DOM解析器和PULL解析 ...

  8. Android网络之数据解析----SAX方式解析XML数据

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  9. 网络相关系列之四:数据解析之SAX方式解析XML数据

    一.XML和Json数据的引入: 通常情况下.每一个须要訪问网络的应用程序都会有一个自己的server.我们能够向server提交数据,也能够从server获取数据.只是这个时候就有一个问题,这些数据 ...

随机推荐

  1. Java 实现 HDFS 文件基本操作

    1. pom <hadoop.version>2.7.3</hadoop.version> <dependency> <groupId>org.apac ...

  2. Swift 里的指针

     基础知识 指针的内存状态 typed? initiated? ❌ ❌ ✅ ❌ ✅ ✅ 之前分配的内存可能被释放,使得指针指向了未被分配的内存. 有两种方式可以使得指针指向的内存处于Uninitia ...

  3. Testing - 软件测试知识梳理 - 测试阶段

    估算 测试对软件工作量的估算的准确性 测试评估软件系统的状况的准确性 关注点: 不准确的估算 不适当的开发过程 不真实的状态报告 如何知道对工作量的估算是正确的 估算工作量的工具很容易出错 对软件工作 ...

  4. 自学vue笔记 (二) : 实例与生命周期

    一: 什么是实例 我们说了,Vue 应用都应该从构建一个 Vue 实例开始.它管理着挂载在它身上的所有内容,因此实例是一个根实例, 所有的组件都应该挂载在根实例上面.创建一个 Vue 实例,需要通过 ...

  5. iOS开发手记-仿QQ音乐播放器动态歌词的实现

    最近朋友想做个音乐App,让我帮忙参考下.其中歌词动态滚动的效果,正好我之前也没做过,顺便学习一下,先来个预览效果. 实现思路 歌词常见的就是lrc歌词了,我们这里也是通过解析lrc歌词文件来获取其播 ...

  6. JAVA实现调用微信js-sdk扫一扫

    喜欢的朋友可以关注下. 已经很久没有给大家分享一片技术文章了,今天抽了点时间来,给大家说一说如何调用微信提供的扫一扫接口. 前提: 需要申请一个公众号:申请公众号需要的资料我就不说了,去申请微信会提示 ...

  7. Zabbix系列之六——添加web监测

    zabbix提供了web监测功能,监控到站点的响应时间,还可以根据站点返回的状态码,或者响应时间做报警,列入服务保证官网确打不开等现象. 官网地址:https://www.zabbix.com/doc ...

  8. 在Ubuntu中搭建KMS服务器

    介绍 基于vlmcsd搭建的KMS服务器. 根据github上的说明,这个工具是用C写的,没有任何依赖,可以直接运行.而且它横跨几乎现在所有的系统平台,如Android, FreeBSD, Solar ...

  9. PL/SQL Developer从11.0.6版本开始32/64为之区分

    PL/SQL Developer从11.0.6版本开始32/64为之区分 在PL/SQL Developer11.0.6版本之前,64位Windows操作系统在使用PL/SQL Developer都未 ...

  10. Kafka实战-Kafka到Storm

    1.概述 在<Kafka实战-Flume到Kafka>一文中给大家分享了Kafka的数据源生产,今天为大家介绍如何去实时消费Kafka中的数据.这里使用实时计算的模型——Storm.下面是 ...