安卓解析XML文件系列2:使用PULL方式
2015-10-08 20:40
351 查看
安卓中解析XML文件的方式有三种,下面将第二种方式的使用方法介绍给大家。
使用pull比使用sax代码量少一些,PULL解析器的运行方式和SAX解析器很相似,它提供了类似的事件。
PULL特点:
简单的结构:一个接口,一个例外,一个工厂组成的PULL解析器
简单易用:PULL解析器只有一个重要的方法next方法,它被用来检索下一个事件,而它只有5个常用的属性:
START DOCUMENT:从文档开始解析
START_TAG:从标记开始
TEXT:获取文本信息
END_TAG:标记结束
END_DOCUMENT:文档结束
PULL缺点:
使用的时候必须要知道各个节点的名称,才能进行解析。
这个例子实现的是使用PULL方式解析XML文件,将web上的一个xml文件解析出语义。
整体思路:新建一个java工程,定义一个libs目录,引入kxml2-2.2.2.jar这个包。定义一个实体类Person,在里面定义它的字段、get和set方法、toString方法,这个实体类中的字段对应xml文件中的节点。定义一个HttpUtils类,在里面getXML方法,在这个方法中使用字符串类型的网址实例化HttpURLConnection对象,设置它的超时时间、input方式、请求方式、获取返回码,如果请求完成,则以输入流的形式返回结果的信息。定一个PullXMLTools类,定义一个List对象和Person对象,在里面定义一个parseXML方法,在这个方法中创建一个xml解析的工厂,获得xml解析类的引用,获得事件的类型,如果没有解析到文档结尾的话,遇到文档开始,实例化一个List对象,遇到开始标志,如果等于person的话,实例化一个Person对象,取出属性值并赋值给Person对象的相应字段,如果等于name的话,获取节点的内容并赋值给Person对象的相应字段,如果等于age的话,获取节点的内容并赋值给Person对象的相应字段,遇到结束标志,把Person对象加入到List对象中,并把Person对象置空,用于装下一个对象,返回LIst对象。定义一个Test类,在里面定义一个主函数,在这个主函数中以网址为参数调用getXML方法返回一个InputStream对象,以InputStream对象为参数调用parseXML方法,返回一个List对象,遍历List对象,输出里面的所有Person对象的信息。
Person.java文件:
HttpUtils.java文件:
PullXMLTools.java文件:
Test.java文件:
使用pull比使用sax代码量少一些,PULL解析器的运行方式和SAX解析器很相似,它提供了类似的事件。
PULL特点:
简单的结构:一个接口,一个例外,一个工厂组成的PULL解析器
简单易用:PULL解析器只有一个重要的方法next方法,它被用来检索下一个事件,而它只有5个常用的属性:
START DOCUMENT:从文档开始解析
START_TAG:从标记开始
TEXT:获取文本信息
END_TAG:标记结束
END_DOCUMENT:文档结束
PULL缺点:
使用的时候必须要知道各个节点的名称,才能进行解析。
这个例子实现的是使用PULL方式解析XML文件,将web上的一个xml文件解析出语义。
整体思路:新建一个java工程,定义一个libs目录,引入kxml2-2.2.2.jar这个包。定义一个实体类Person,在里面定义它的字段、get和set方法、toString方法,这个实体类中的字段对应xml文件中的节点。定义一个HttpUtils类,在里面getXML方法,在这个方法中使用字符串类型的网址实例化HttpURLConnection对象,设置它的超时时间、input方式、请求方式、获取返回码,如果请求完成,则以输入流的形式返回结果的信息。定一个PullXMLTools类,定义一个List对象和Person对象,在里面定义一个parseXML方法,在这个方法中创建一个xml解析的工厂,获得xml解析类的引用,获得事件的类型,如果没有解析到文档结尾的话,遇到文档开始,实例化一个List对象,遇到开始标志,如果等于person的话,实例化一个Person对象,取出属性值并赋值给Person对象的相应字段,如果等于name的话,获取节点的内容并赋值给Person对象的相应字段,如果等于age的话,获取节点的内容并赋值给Person对象的相应字段,遇到结束标志,把Person对象加入到List对象中,并把Person对象置空,用于装下一个对象,返回LIst对象。定义一个Test类,在里面定义一个主函数,在这个主函数中以网址为参数调用getXML方法返回一个InputStream对象,以InputStream对象为参数调用parseXML方法,返回一个List对象,遍历List对象,输出里面的所有Person对象的信息。
Person.java文件:
public class Person { private int id; private String name; private int age; public Person() { // TODO Auto-generated constructor stub } // 写好了字段,可以直接生成构造方法、get、set方法、toString方法 public Person(int id, String name, int age) { super(); this.id = id; this.name = name; this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person [id=" + id + ", name=" + name + ", age=" + age + "]"; } }
HttpUtils.java文件:
public class HttpUtils { //从服务器获取xml文件返回流 public HttpUtils() { // TODO Auto-generated constructor stub } public static InputStream getXML(String path){ InputStream inputStream=null; try { URL url=new URL(path); if(url!=null){ HttpURLConnection connection=(HttpURLConnection)url.openConnection(); connection.setConnectTimeout(3000); connection.setDoInput(true); connection.setRequestMethod("GET"); int code=connection.getResponseCode(); if(code==200){ inputStream=connection.getInputStream(); } } } catch (Exception e) { // TODO: handle exception } return inputStream; } }
PullXMLTools.java文件:
public class PullXMLTools { public PullXMLTools() { // TODO Auto-generated constructor stub } //inputStream从服务器获取xml文件,以流的形式返回;encode编码格式 public static List<Person> parseXML(InputStream inputStream,String encode) throws Exception{ List<Person> list=null; Person person=null;//装载解析每一个xml节点的信息 // 创建一个xml解析的工厂 XmlPullParserFactory factory=XmlPullParserFactory.newInstance(); // 获得xml解析类的引用 XmlPullParser parser=factory.newPullParser(); parser.setInput(inputStream,encode); // 获得事件的类型 int eventType=parser.getEventType(); while (eventType!=XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_DOCUMENT://如果是开始节点 list=new ArrayList<Person>(); break; case XmlPullParser.START_TAG: if("person".equals(parser.getName())){ person=new Person(); // 取出属性值 int id=Integer.parseInt(parser.getAttributeValue(0)); person.setId(id); }else if("name".equals(parser.getName())){ String name=parser.nextText();//获取节点的内容 person.setName(name); }else if("age".equals(parser.getName())){ int age=Integer.parseInt(parser.nextText()); person.setAge(age); } break; case XmlPullParser.END_TAG: if("person".equals(parser.getName())){ list.add(person); person=null;//把对象置空,用于装下一个对象 } break; } eventType=parser.next(); } return list; } }
Test.java文件:
public class Test { public Test() { // TODO Auto-generated constructor stub } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String path="http://pc-20150724xmdx:8080/myhttp/person.xml"; InputStream inputStream=HttpUtils.getXML(path); List<Person> list=null; try { list=PullXMLTools.parseXML(inputStream, "utf-8"); for(Person person:list){ System.out.println(person.toString()); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }person.xml文件:
<persons> <person id="23"> <name>罗志祥</name> <age>36</age> </person> <person id="24"> <name>周杰伦</name> <age>35</age> </person> </persons>
相关文章推荐
- frame,
- 京东构建需求响应式亿级商品详情页技术分析
- Linux内核工程导论——存储:文件系统
- 代码简洁之道:C++ 11 之auto+ for_each + lamda表达式
- layoutSubViews方法调用时机
- ios图形上下文CGContext
- HDU 4694 Important Sisters Lengauer_Tarjan算法
- 二维码
- 面向对象练习
- leecode algo1: Two Sum (Java)
- 动态联编
- Linux内核工程导论——硬件:无线子系统
- Age Sort UVA 11462
- [NOIP2014]寻找道路 D2 T2
- C++实现一个类只有一个实例对象
- Linux内核工程导论——硬件:音频子系统
- 黑马程序员---OC学习笔记之常见结构体
- iOS:触摸事件和手势识别的介绍
- RTP/RTCP协议
- Dynamic Web Module 3.0 requires Java 1.6 or newer