Java数据解析---PULL

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

1、PULL解析

2、SAX解析

3、DOM解析

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

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

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

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

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

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

1、解析本地xml文件

 1 public class PullParser {
 2     
 3     public List<Worker> pullParsers() throws XmlPullParserException, IOException
 4     {
 5         List<Worker> list = null;
 6         Worker worker = null;
 7         //第一步:创建XML解析对象,需要通过工厂模式创建类的实例
 8         XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
 9         XmlPullParser parser = factory.newPullParser();
10 //        第二步:设置待解析的xml数据源
11         FileInputStream fis = new FileInputStream("worker.xml");
12         parser.setInput(fis,"utf-8");
13 //        第三步:获取当前xml标签的事件类型
14         int event = parser.getEventType();
15 //        第四步:通过分支语句处理不同的事件标签
16         while(event!=XmlPullParser.END_DOCUMENT)
17         {
18             
19             switch(event)
20             {
21 //            第五步:获取标签名称,处理标签信息
22             case XmlPullParser.START_DOCUMENT://解析文件开始,创建列表集合对象
23                 list = new ArrayList<Worker>();
24                 break;
25             case XmlPullParser.START_TAG:
26                 String tagName = parser.getName();
27                 if("worker".equals(tagName))
28                 {
29                     worker = new Worker();
30                     int count = parser.getAttributeCount();//得到属性的个数
31                     for(int i=0;i<count;i++)
32                     {
33                         String attrName = parser.getAttributeName(i);
34                         String attrValue = parser.getAttributeValue(i);
35                         if("id".equals(attrName))
36                             worker.setId(attrValue);
37                     }
38                 }
39                 else if("name".equals(tagName))
40                     worker.setName(parser.nextText());
41                     worker.setMoney(Double.parseDouble(parser.nextText()));
42                 break;
43                 
44             case XmlPullParser.END_TAG://解析文件结束,
45                  if("worker".equals(parser.getName()))
46                  {
47 //                第六步:将处理的数据保存到JavaBean或Map对象中
48                      list.add(worker);
49                      worker = null;
50                  }
51                  break;
52             }
53 //            第七步:获取下一个标签的事件类型,判断事件类型是否为文档结束事件,如果是则退出,反之重复第四、五、六步
54             event = parser.next();
55         }
56         return list;
57     }
58 
59     /**
60      * @param args
61      * @throws IOException 
62      * @throws XmlPullParserException 
63      */
64     public static void main(String[] args) throws XmlPullParserException, IOException {
65         PullParser  pullParser = new PullParser();
66         List<Worker> list = pullParser.pullParsers();
67         
68         for(Worker w:list)
69         {
70             System.out.println(w);
71         }
72     }
73 
74 }
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <workers>
 3     <worker id="AQ01">
 4         <name>Mark</name>
 5     </worker>
 6     <worker id="AD02">
 7         <name>Luch</name>
 8     </worker>
 9     <worker id="AD03">
10         <name>Lily</name>
11     </worker>
12     <worker id="AD04">
13         <name>Lily</name>
14     </worker>
15 </workers>
 1 package com.qianfeng.pullparser2;
 2 
 3 public class Worker {
 4     
 5     private String id;
 6     private String name;
 7 
 8     public Worker() {
 9         super();
10         // TODO Auto-generated constructor stub
11     }
12     public Worker(String id, String name) {
13         super();
14         this.id = id;
15         this.name = name;
16 
17     }
18     public String getId() {
19         return id;
20     }
21     public void setId(String id) {
22         this.id = id;
23     }
24     public String getName() {
25         return name;
26     }
27     public void setName(String name) {
28         this.name = name;
29     }
30 
31     @Override
32     public String toString() {
33         return "Worker [id=" + id + ", name=" + name + "]";
34     }
35 }

解析效果:

1 Worker [id=AQ01, name=Mark]
2 Worker [id=AD02, name=Luch]
3 Worker [id=AD03, name=Lily]
4 Worker [id=AD04, name=Lily]

2、解析服务器的xml文件

 1 package pull;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.util.ArrayList;
 6 import java.util.List;
 7 
 8 import org.xmlpull.v1.XmlPullParser;
 9 import org.xmlpull.v1.XmlPullParserException;
10 import org.xmlpull.v1.XmlPullParserFactory;
11 
12 public class Pull {
13 
14     /**
15      * @param args
16      * @throws XmlPullParserException 
17      * @throws IOException 
18      */
19     public static void main(String[] args) throws XmlPullParserException, IOException {
20         // TODO Auto-generated method stub
21         List<Person> list = null;
22         Person person=null;
23         
24         XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
25         XmlPullParser parser =  factory.newPullParser();
26         String path ="http://localhost:8080/aaa/person.xml";
27         InputStream in = HttpUtil.getInputStream(path);
28         parser.setInput(in, "utf-8");
29         int event = parser.getEventType();
30         while(event!=XmlPullParser.END_DOCUMENT)
31         {
32             switch(event)
33             {
34             case XmlPullParser.START_DOCUMENT:
35                 System.out.println("文件解析开始");
36                 list = new ArrayList<Person>();
37                 break;
38             case XmlPullParser.START_TAG:
39                 String str = parser.getName();
40                 if("person".equals(str))
41                 {
42                     person = new Person();
43                     int count = parser.getAttributeCount();
44                     for(int i=0;i<count;i++)
45                     {
46                         String key = parser.getAttributeName(i);
47                         String value = parser.getAttributeValue(i);
48                         if("id".equals(key))
49                         {
50                             person.setName(value);
51                         }
52                     }
53                 }
54                 else if("name".equals(str))
55                 {
56                     person.setName(parser.nextText());
57                 }
58                 break;
59             case XmlPullParser.END_TAG:
60                 if("person".equals(parser.getName()))
61                 {
62                     list.add(person);
63                     person=null;
64                 }
65                 break;
66             }
67             event = parser.next();
68             
69         }
70         
71         for(int i=0;i<list.size();i++)
72         {
73             System.out.println(list);
74         }
75         
76         
77     }
78 
79 }

对应的HttpUtil自定义类getInpustStream方法

 1 package pull;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.net.HttpURLConnection;
 6 import java.net.MalformedURLException;
 7 import java.net.URL;
 8 
 9 public class HttpUtil {
10     public static InputStream getInputStream(String path) throws IOException{
11         URL url = new URL(path);
12         HttpURLConnection conn = (HttpURLConnection) url.openConnection();
13         conn.setRequestMethod("GET");
14         conn.setConnectTimeout(5000);
15         conn.setDoInput(true);
16         if(conn.getResponseCode() ==200)
17         {
18             InputStream in = conn.getInputStream();
19             return in;
20         }
21         
22         
23         return null;
24         
25     }
26 
27 }

解析效果:

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微信公众号:Java团长

Java类加载器详解(下)

这个类中定义了一个加密和解密的算法,很简单的,就是将字节和oxff异或一下即可,而且这个算法是加密和解密的都可以用,很是神奇呀!

16630
来自专栏Android 研究

OKHttp源码解析(五)--OKIO简介及FileSystem

okio是由square公司开发的,它补充了java.io和java.nio的不足,以便能够更加方便,快速的访问、存储和处理你的数据。OKHttp底层也是用该库...

28430
来自专栏冰霜之地

高效的序列化/反序列化数据方式 Protobuf

上篇文章中其实已经讲过了 encode 的过程,这篇文章以 golang 为例,从代码实现的层面讲讲序列化和反序列化的过程。

66650
来自专栏java学习

Java每日一练(2017/6/8)

Java基础 | 数据库 | Android | 学习视频 | 学习资料下载 课前导读 ●回复"每日一练"获取以前的题目! ●答案公布时间:为每期发布题目的第二...

28070
来自专栏芋道源码1024

Spring Webflux —— 源码阅读之 handler 包

查找给定请求的handler,如果找不到特定的请求,则返回一个空的Mono。这个方法被getHandler(org.springframework.web.se...

41950
来自专栏Spark生态圈

[Spark SQL] 源码解析之Analyzer

Analyzer模块将Unresolved LogicalPlan结合元数据catalog进行绑定,最终转化为Resolved LogicalPlan。跟着代码...

13920
来自专栏androidBlog

Android 常用工具类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/de...

21210
来自专栏黄Java的地盘

[翻译]WebSocket协议第二章——Conformance Requirements

本文为WebSocket协议的第二章,本文翻译的主要内容为WebSocket协议中相关术语的介绍。

10110
来自专栏数据结构与算法

BZOJ1269: [AHOI2006]文本编辑器editor

Descriptio 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器。你能帮助他吗? 为了明确任务目标,可可对“文本编辑器...

29870
来自专栏jeremy的技术点滴

JVM的Finalization Delay引起的OOM

43280

扫码关注云+社区

领取腾讯云代金券