Java数据解析---PULL

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 安卓和JAVA解析xml文件的三种方式: 1、PULL解析 2、SAX解析 3、DOM解析 三者各有所长,依情况选择解析方式 1、PULL和SAX均采用流式解析,意味着只能从头读到底,无法像DOM解析一样随机访问xml文件中的任意一个节点 2、PULL和SAX占用更少的内存解析,更适用于...

安卓和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 }
Demo
 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>
xml文件
 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 }
Worker.class 对象类

解析效果:

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 }
View Code

对应的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 }
HttpHtil.java

解析效果:

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]]
控制台信息

 

相关文章
|
6天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
|
17天前
|
数据采集 存储 JavaScript
如何使用Cheerio与jsdom解析复杂的HTML结构进行数据提取
在现代网页开发中,复杂的HTML结构给爬虫技术带来挑战。传统的解析库难以应对,而Cheerio和jsdom在Node.js环境下提供了强大工具。本文探讨如何在复杂HTML结构中精确提取数据,结合代理IP、cookie、user-agent设置及多线程技术,提升数据采集的效率和准确性。通过具体示例代码,展示如何使用Cheerio和jsdom解析HTML,并进行数据归类和统计。这种方法适用于处理大量分类数据的爬虫任务,帮助开发者轻松实现高效的数据提取。
如何使用Cheerio与jsdom解析复杂的HTML结构进行数据提取
|
3天前
|
Java 程序员 开发者
Java中的异常处理机制深度解析
本文旨在深入探讨Java中异常处理的核心概念与实际应用,通过剖析异常的本质、分类、捕获及处理方法,揭示其在程序设计中的关键作用。不同于常规摘要,本文将直接切入主题,以简明扼要的方式概述异常处理的重要性及其在Java编程中的应用策略,引导读者快速把握异常处理的精髓。
|
3天前
|
存储 关系型数据库 MySQL
技术解析:MySQL中取最新一条重复数据的方法
以上提供的两种方法都可以有效地从MySQL数据库中提取每个类别最新的重复数据。选择哪种方法取决于具体的使用场景和MySQL版本。子查询加分组的方法兼容性更好,适用于所有版本的MySQL;而窗口函数方法代码更简洁,执行效率可能更高,但需要MySQL 8.0及以上版本。在实际应用中,应根据数据量大小、查询性能需求以及MySQL版本等因素综合考虑,选择最合适的实现方案。
22 6
|
2天前
|
安全 Java 开发者
Java并发编程中的锁机制解析
本文深入探讨了Java中用于管理多线程同步的关键工具——锁机制。通过分析synchronized关键字和ReentrantLock类等核心概念,揭示了它们在构建线程安全应用中的重要性。同时,文章还讨论了锁机制的高级特性,如公平性、类锁和对象锁的区别,以及锁的优化技术如锁粗化和锁消除。此外,指出了在高并发环境下锁竞争可能导致的问题,并提出了减少锁持有时间和使用无锁编程等策略来优化性能的建议。最后,强调了理解和正确使用Java锁机制对于开发高效、可靠并发应用程序的重要性。
12 3
|
5天前
|
存储 监控 算法
Java中的内存管理与垃圾回收机制解析
本文深入探讨了Java编程语言中的内存管理策略和垃圾回收机制。首先介绍了Java内存模型的基本概念,包括堆、栈以及方法区的划分和各自的功能。进一步详细阐述了垃圾回收的基本原理、常见算法(如标记-清除、复制、标记-整理等),以及如何通过JVM参数调优垃圾回收器的性能。此外,还讨论了Java 9引入的接口变化对垃圾回收的影响,以及如何通过Shenandoah等现代垃圾回收器提升应用性能。最后,提供了一些编写高效Java代码的实践建议,帮助开发者更好地理解和管理Java应用的内存使用。
|
6天前
|
Java 开发者
深入解析Java中的异常处理机制
本文将深入探讨Java中异常处理的核心概念和实际应用,包括异常的分类、捕获、处理以及最佳实践。我们将通过具体示例展示如何有效使用try-catch块、throws关键字和自定义异常类,以帮助读者更好地理解和应用Java异常处理机制。
11 1
|
6天前
|
Java 程序员 开发者
Java中的异常处理机制深度解析
本文旨在深入探讨Java中异常处理的机制,包括异常的分类、如何捕获和处理异常,以及自定义异常的最佳实践。通过实例讲解,帮助读者更好地理解如何在Java编程中有效管理和利用异常处理来提高代码的健壮性和可维护性。
|
7天前
|
存储 负载均衡 Java
Jetty技术深度解析及其在Java中的实战应用
【9月更文挑战第3天】Jetty,作为一款开源的、轻量级、高性能的Java Web服务器和Servlet容器,自1995年问世以来,凭借其卓越的性能、灵活的配置和丰富的扩展功能,在Java Web应用开发中占据了举足轻重的地位。本文将详细介绍Jetty的背景、核心功能点以及在Java中的实战应用,帮助开发者更好地理解和利用Jetty构建高效、可靠的Web服务。
22 2
|
18天前
|
XML JSON API
淘宝京东商品详情数据解析,API接口系列
淘宝商品详情数据包括多个方面,如商品标题、价格、图片、描述、属性、SKU(库存量单位)库存、视频等。这些数据对于买家了解商品详情以及卖家管理商品都至关重要。

热门文章

最新文章

推荐镜像

更多