博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用PULL解析器解析XML文件
阅读量:7086 次
发布时间:2019-06-28

本文共 6769 字,大约阅读时间需要 22 分钟。

第一种方式(简洁,直接用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
readXML(InputStream inStream) throws Exception{ 13 14 List
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
(); 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(); //得到当前节点下一个文本节点的内容------>
liming
得到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
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文档不能带有首行:
, 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
pullxml(InputStream in)throws Exception{ 38 List
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
();// 初始化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 }

 

转载地址:http://uerml.baihongyu.com/

你可能感兴趣的文章
JVM Input Arguments Lookup (JMX)(转)
查看>>
我持续推动Rust语言支持Windows XP系统
查看>>
Http状态码说明
查看>>
浏览器缓存相关http头
查看>>
Autofac.Integration.Owin
查看>>
NGINX反向代理
查看>>
完整部署CentOS7.2+OpenStack+kvm 云平台环境(6)--在线调整虚拟机的大小
查看>>
[LeetCode] Sort Characters By Frequency 根据字符出现频率排序
查看>>
lower_bound与upper_bound
查看>>
vue2
查看>>
质量评估面面观--聊一聊软件上线前的质量评估
查看>>
Appfabric caching 使用半年总结
查看>>
20个代码生成框架
查看>>
树莓派3b配置耳机音频输出
查看>>
ES6 Class
查看>>
python -- lambda表达式
查看>>
在centos搭建git服务器时,不小心把/home/git目录删除了,我是怎么恢复的
查看>>
EM算法原理
查看>>
力软移动框架 ionic cordova插件jpush-phonegap-plugin 极光推送配置方法 vs2017
查看>>
H5触摸事件判断滑动方向
查看>>