当前位置: 首页 > 编程日记 > 正文

用PULL解析器解析XML文件


第一种方式(简洁,直接用pullparser.nextText()来返回下一个String类型的值):

复制代码
 1 package lee.service;   
 2   
 3 import java.io.InputStream;   
 4 import java.util.ArrayList;   
 5 import java.util.List;   
 6 import org.xmlpull.v1.XmlPullParser;   
 7 import android.util.Xml;   
 8 import lee.vo.Person;   
 9   
10 public class XMLPullService {   
11        
12     public List<Person> readXML(InputStream inStream) throws Exception{   
13        
14         List<Person> persons = null;   
15            
16         Person person = null;   
17            
18         XmlPullParser pullParser = Xml.newPullParser(); //获取Pull解析器 Xml.newPullParser()添加一个pullParser解析器带命名空间的支持   
19            
20         pullParser.setInput(inStream, "UTF-8");     //设置Pull解析器进行解析的XML内容   
21            
22         int event = pullParser.getEventType();      //获取第一个事件   
23            
24         while(event!=XmlPullParser.END_DOCUMENT)    //如果还不是结束文档事件,迭代每一个元素   
25         {   
26             switch (event)   
27             {   
28             case XmlPullParser.START_DOCUMENT:              //开始文档事件   
29                 persons = new ArrayList<Person>();   
30                 break;   
31        
32             case XmlPullParser.START_TAG:                   //开始元素事件   
33                 if("person".equals(pullParser.getName()))       //pullParser.getName()得到当前指针所指向的节点的名称   
34                 {   
35                     person = new Person();   
36                     int id = new Integer(pullParser.getAttributeValue(0));   
37                     person.setId(id);   
38                 }   
39                 if(person!=null)   
40                 {   
41                     if("name".equals(pullParser.getName()))   
42                     {   
43                         String name = pullParser.nextText();    //得到当前节点下一个文本节点的内容------>  <name>liming</name> 得到liming   
44                         person.setName(name);   
45                     }   
46                     else if("age".equals(pullParser.getName()))   
47                     {   
48                         String age = pullParser.nextText(); //获取下一个Text类型节点的值   
49                         person.setAge(new Short(age));   
50                     }   
51                 }   
52                 break;   
53             case XmlPullParser.END_TAG:                 //结束元素事件   
54                 if("person".equals(pullParser.getName()))   
55                 {   
56                     persons.add(person);   
57                     person = null;   
58                 }   
59                 break;   
60             }   
61             event = pullParser.next();                  //进入下一个元素并触发相应事件   
62         }   
63         return persons;   
64     }   
65 } 
复制代码

第二种方式(较为复杂,用pullparser.Next()来进入下一个元素,用.textNext来返回当前String类型元素的值):

复制代码
 1 public class PullXmlActivity extends Activity{  
 2     private List<Book> list=null;  
 3     private PullXmlAdapter adapter;  
 4     private ListView lv;  
 5     @Override  
 6     protected void onCreate(Bundle savedInstanceState) {  
 7         // TODO Auto-generated method stub   
 8         super.onCreate(savedInstanceState);  
 9         setContentView(R.layout.listview);  
10         lv=(ListView)findViewById(R.id.listView);  
11         InputStream in;  
12         try {  
13             in = this.getAssets().open("books.xml");  
14               
15             list=pullxml(in);  
16               
17         } catch (IOException e) {  
18             // TODO Auto-generated catch block   
19             e.printStackTrace();  
20         } catch (Exception e) {  
21             // TODO Auto-generated catch block   
22             e.printStackTrace();  
23         }  
24         adapter=new PullXmlAdapter(PullXmlActivity.this, list);   
25         lv.setAdapter(adapter);  
26     }  
27     /**xml文件的获取 
28      * 1.xml文件放在res的xml文件夹下(推荐)使用XmlResourceParser xmlParser = this.getResources().getXml(R.xml.XXX); 
29      * 2.xml文件放在raw的xml文件夹下使用InputStream inputStream =this.getResources().openRawResource(R.raw.XXX);  
30      * 3.xml文件放在assets文件夹下(本人测试发现通过此方法获取的XML文档不能带有首行:<?xml version="1.0" encoding="utf-8"?>, 
31      * 否则解析报错,具体原因未查明:InputStream inputStream = getResources().getAssets().open(fileName); 
32      * 4.xml文件放在SD卡, path路径根据实际项目修改,此次获取SDcard根目录:    
33      * String path = Environment.getExternalStorageDirectory().toString();   
34      * File xmlFlie = new File(path+fileName);   
35      * InputStream inputStream = new FileInputStream(xmlFlie);   
36      */  
37     public List<Book> pullxml(InputStream in)throws Exception{  
38         List<Book> list=null;  
39         Book book = null;  
40             // 由android.util.Xml创建一个XmlPullParser实例   
41             XmlPullParser parser = Xml.newPullParser();  
42             // 设置输入流 并指明编码方式   
43                parser.setInput(in, "UTF-8");  
44             // 产生第一个事件   
45                int eventType = parser.getEventType();  
46                  
47                while (eventType != XmlPullParser.END_DOCUMENT) {  
48                    switch (eventType) {  
49                 // 判断当前事件是否为文档开始事件   
50                    case XmlPullParser.START_DOCUMENT:  
51                        list=new ArrayList<Book>();// 初始化list集合   
52                        break;  
53                     // 判断当前事件是否为标签元素开始事件   
54                    case XmlPullParser.START_TAG:  
55                        if (parser.getName().equals("book")) { // 判断开始标签元素是否是book   
56                            book = new Book();  
57                        } else if (parser.getName().equals("id")) {  
58                            eventType = parser.next();  
59                            // 得到book标签的属性值,并设置book的id   
60                             book.setId(Integer.parseInt(parser.getText()));  
61                         } else if (parser.getName().equals("name")) { // 判断开始标签元素是否是book   
62                              eventType = parser.next();  
63                              book.setName(parser.getText());  
64                         } else if (parser.getName().equals("price")) { // 判断开始标签元素是否是price   
65                             eventType = parser.next();  
66                              book.setPrice(Float.parseFloat(parser.getText()));  
67                         }  
68                        break;  
69                     // 判断当前事件是否为标签元素结束事件   
70                    case XmlPullParser.END_TAG:  
71                        if (parser.getName().equals("book")) { // 判断结束标签元素是否是book   
72                            list.add(book); // 将book添加到books集合   
73                            book = null;  
74                        }  
75                        break;  
76                    }  
77                    // 进入下一个元素并触发相应事件   
78                    eventType = parser.next();  
79                }  
80                return list;  
81     }  
82 }  

转载于:https://www.cnblogs.com/baiduligang/p/4247545.html

相关文章:

iOS端Socket(二)ProtocolBuffer使用

ProtocolBuffer使用 一、环境及ProtocolBuffer的安装 分别在终端执行以下命令&#xff1a; ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"brew install protobuf-swift brew install automake brew install libtoo…

Wireshark分析实战:某达速递登录帐号密码提取

“使用某达速递的官网登陆及APP登录&#xff0c;来学习Wireshark的使用。”在如今这个HTTPS深入人心的情况下&#xff0c;作为一个也不算很小的快递&#xff0c;某达速递&#xff0c;不但全站HTTP&#xff0c;而且登录帐号密码明文未加密传输&#xff0c;也算是技术落后到了一定…

【并行计算-CUDA开发】从零开始学习OpenCL开发(一)架构

多谢大家关注 转载本文请注明&#xff1a;http://blog.csdn.net/leonwei/article/details/8880012 本文将作为我《从零开始做OpenCL开发》系列文章的第一篇。 1 异构计算、GPGPU与OpenCL OpenCL是当前一个通用的由很多公司和组织共同发起的多CPU\GPU\其他芯片 异构计算&#xf…

使用 fcntl 函数 获取,设置文件的状态标志

前言 当打开一个文件的时候&#xff0c;我们需要指定打开文件的模式( 只读&#xff0c;只写等 )。那么在程序中如何获取&#xff0c;修改这个文件的状态标志呢&#xff1f;本文将告诉你如何用 fcntl函数 获取指定文件的状态标志。 解决思路 1. 对于获取文件状态标志&#xff0c…

UILabel显示带颜色边的文字

需求如图&#xff0c;UILabel要实现带红色边的文字显示。 1、新建UILabel的子类JXBorderLabel 2、重写drawRect:方法 #import "JXBorderLabel.h"implementation JXBorderLabel- (void)drawRect:(CGRect)rect {//1.获取上下文CGContextRef context UIGraphicsGe…

协议分析中的TCP/IP网络协议

“ TCP/IP协议作为互联网的基础&#xff0c;在协议分析中不可或缺&#xff0c;本文介绍在对协议进行分析还原的过程中的一些要点&#xff0c;快速掌握协议还原的精髓。” 注意&#xff0c;本文比较枯燥乏味&#xff0c;若非需要了解TCP/IP协议相关信息&#xff0c;建议绕行。 …

忠告初学者学习Linux系统的8点建议

忠告初学者学习Linux系统的8点建议新手或者说即将要入坑的小伙伴们&#xff0c;常常在QQ群或者在Linux论坛问一些问题&#xff0c;不过&#xff0c;其中大多数的问题都是很基础的。例如&#xff1a;如何给添加的用户归属用户组&#xff0c;复制整个文件到另一个目录下面&#x…

iOS显示gif图片的几种方法

方法一、传统方式 //1.加载Gif图片&#xff0c;转换成Data类型NSString *path [NSBundle.mainBundle pathForResource:"demo" ofType:"gif"];NSData *data [NSData dataWithContentsOfFile:path];//2.将data数据转换成CGImageSource对象CGImageSourceRe…

简单文件传输协议TFTP分析还原

“ 介绍TFTP协议及传输内容的还原。”TFTP&#xff0c;全称为Trivial File Transfer Protocol&#xff0c;即简单文件传输协议&#xff0c;是一个用来在客户端与服务器之间进行简单文件传输的协议&#xff0c;UDP承载&#xff0c;它真的很简单。其协议标准为RFC1350&#xff0c…

Oracle中的字符处理方法

向左补全字符串lpad(字段名,填充长度,填充的字符) select lpad(1,4,0) from dual; 向右补全字符串rpad(字段名,填充长度,填充的字符) select rpad(1,4,0) from dual; 返回字符串小写select lower(STUDENT) from dual; 返回字符串大写select upper(admin) from dual; 单词首字符…

fwt优化+树形DP HDU 5909

1 //fwt优化树形DP HDU 59092 //见官方题解3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/4 5 #include <bits/stdc.h>6 // #include <iostream>7 // #include <cstdio>8 // #include <cstdlib>9 // #include <algorithm> 10 // #inclu…

iOS直播(二)GPUImage音视频采集

上文中介绍了用AVFoundation实现音视频采集&#xff08;https://blog.csdn.net/dolacmeng/article/details/81268622&#xff09; &#xff0c;开源的基于GPU的第三方图像处理库GPUImage对AVFoundation进行了进一步的封装&#xff0c;打开GPUImgeVideoCamera.m查看代码&#xf…

Wireshark使用技巧:提取VOIP通话中的音频流

“Wireshark的RTP流分析功能实战。”在VOIP协议的分析过程中&#xff0c;常常会遇到一些标准协议承载的语音传输&#xff0c;如以SIP、H.323为控制协商协议&#xff0c;RTP为语音数据协议的VOIP传输情况。在语音协议的分析过程中&#xff0c;需要提取的一个重要项是语音内容&am…

在预装win8的电脑上换win7系统讲解

现在买电脑&#xff0c;如果电脑预装的系统是win8系统&#xff0c;那么这个电脑的默认启动模式应该就是UEFI模式&#xff0c;现在UEFI模式正在逐渐取代传统模式。UEFI启动需要一个独立的分区&#xff0c;它将系统启动文件和操作系统本身隔离&#xff0c;可以更好的保护系统的启…

iOS直播(三)GPUImage音视频采集并写入文件

上一篇介绍了用GPUImage图像处理库进行图像采集&#xff0c;从而避免了直接使用AVFoundation&#xff08;AVKit&#xff09;时繁琐的代码&#xff0c;同时不用熟悉OpenGL ES也可以快速地对图像进行美颜、添加滤镜等。这一篇介绍如果使用多个滤镜以及录制视频&#xff0c;并保存…

使用Wireshark进行DNS协议解析

“ DNS协议格式解析及说明。”DNS即域名系统&#xff08;Domain Name System&#xff09;&#xff0c;是用来将域名与IP地址建立映射的协议&#xff0c;通过DNS协议&#xff0c;可以方便记忆。DNS可基于TCP或UDP&#xff0c;使用53号端口&#xff0c;常见的是使用UDP承载&#…

iOS直播(四)对视频进行压缩编码

1.为什么要进行编码? 不经过压缩编码的原视频&#xff0c;所占空间大&#xff0c;不便于保存和网络传输&#xff0c;所以视频录制完后&#xff0c;需要先编码&#xff0c;再传输&#xff0c;解码后再播放。 2.视频为什么可以被压缩&#xff1f; 视频存在冗余信息&#xff0…

nRF51800 蓝牙学习 进程记录 2:关于二维数组 执念执战

前天在玩OLED时想完成一直想弄得一个东西&#xff0c;就是简单的单片机游戏。因为STM32和nRF51822的内存足够&#xff0c;所以就用缓存数组的方法来显示图像&#xff08;我也不知道术语是啥&#xff0c;反正就是在内存中建立一个128X64的二维数组&#xff0c;更新显示时将整个数…

.net卸载程序制作

.net卸载程序制作 原文:.net卸载程序制作方法一&#xff1a; 在打包项目中添加文件msiexec.exe(一般在c:\windows\system32(系统目录中)找到)。 在文件系统视图中选择应用程序文件&#xff0c;在msiexec.exe上单击右键选择“创建快捷方式”&#xff0c;重命名快捷方式为“unins…

Windows下的DNS命令用法

“Windows下DNS相关命令的用法。”在协议分析过程中&#xff0c;经常会遇到一种情况&#xff0c;一次对某域名抓包的过程中&#xff0c;抓到了某个域名的DNS请求&#xff0c;之后再抓包&#xff0c;却抓不到的情况。这时候就需要DNS命令出马了&#xff0c;本文介绍Windows下的D…

Kafka集群配置说明

#kafka数据的存放地址&#xff0c;多个地址的话用逗号分 log.dirs/tmp/kafka-logs #broker server服务端口 port9092 #这个参数会在日志segment没有达到log.segment.bytes设置的大小&#xff0c;也会强制新建一个segment会被 topic创建时的指定参数覆盖 log.roll.hours24 #是否…

Tomcat漏洞说明与安全加固

Tomcat是Apache软件基金会的一个免费的、开放源码的WEB应用服务器&#xff0c;可以运行在Linux和Windows等多个平台上&#xff0c;由于其性能稳定、扩展性好、免费等特点深受广大用户的喜爱。目前&#xff0c;互联网上绝大多数JAVA WEB应用都运行在Tomcat服务器上。 Tomcat作为…

《人性的优点》笔记

1.相信自己&#xff0c;做一个成功的人 2.《圣经》中说&#xff1a;“攻克己心&#xff0c;强如攻城” 3.人最大的敌人&#xff0c;不是别人&#xff0c;正是自己 4.不要为木已成舟的事情耗费太多的心血&#xff0c;你无法改变它 5.忧虑是健康的大敌&#xff0c;它只会让你的生…

SIP协议分析

“ 音视频通话控制协议SIP介绍。”SIP&#xff08;Session Initiation Protocol&#xff09;&#xff0c;即会话发起协议&#xff0c;在RFC2543、RFC3261等中被定义&#xff0c;是一个VOIP信令协议&#xff0c;其目的是在IP网络中实现电话功能&#xff0c;即软电话功能。在互联…

Struts2的工作原理

Struts2是在Struts1的基础上发展而来的&#xff0c;Struts是WebWork和Struts1的集合&#xff0c;采用的正是WebWork的核心&#xff0c;更多的是WebWork。 下载的Struts2源代码文件 主要的包和类&#xff1a; 包名 说明 org.apache.struts2. components 该包封装视图组件&…

Tiny4412 Uboot

1. Build uboot a) 安装好toolchain (arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz)并设置好 环境变量PATH&#xff0c;保证可以正常使用。 b) 解压 uboot_tiny4412-20130729.tgz 并进入相应的目录 tar xzf uboot_tiny4412-20130729.tgz c) 配置 uboot 并编译 cd uboot_tiny4412 m…

iOS逆向(1)——利用ipa重签名,3分钟iPhone安装多个微信

本文要达成如图效果&#xff0c;在一台iPhone上安装第二个微信&#xff1a; 准备&#xff1a; Xcode微信ipa&#xff08;可通过iTool进行下载&#xff09;重签名脚本 步骤 打开Xcode&#xff0c;新建Single View App项目&#xff0c;名字可以随意&#xff0c;这里就用Wech…

使用Fiddler进行HTTP流量分析

“ Fiddler抓包工具使用。”Fiddler作为一个PC端的HTTP/HTTPS协议分析工具&#xff0c;能够抓取PC上的流量&#xff0c;并且它对HTTP类数据的分析&#xff0c;要比Wireshark要简单&#xff0c;友好&#xff0c;它对数据的组织格式很好地提高了分析效率。本文介绍如何在PC上使用…

Java学习笔记(二一)——Java 泛型

【前面的话】 最近脸好干&#xff0c;掉皮&#xff0c;需要买点化妆品了。 Java泛型好好学习一下。 【定义】 一、泛型的定义主要有以下两种&#xff1a; 在程序编码中一些包含类型参数的类型&#xff0c;也就是说泛型的参数只可以代表类&#xff0c;不能代表个别对象。&#x…

GitHub与Git入门

一、GitHub GitHub为开发者提供Git仓库的托管服务&#xff0c;可以进行代码共享、团队协同开发&#xff0c;创建了社会化&#xff08;social coding&#xff09;编程的概念。 二、GitHub与Git的区别 开发者将源代码存入“Git”仓库&#xff0c;而GitHub则在网络上提供Git仓库…