使用pull解析xml文件
老罗视频学习笔记。
sax和pull是android常用的两种解析xml文件的方式,但是pull更常用,以为代码量小很多。 pull有五个常用的属性: START_DOCUMENT:文档开始,相当于<persons> START_TAG:节点开始,相当于<person> TEXT: END_TAG:节点结束,相当于</person> END_DOCUMENT:文档结束,相当于</persons> 要解析的服务器端的xml文件如下: <?xml version="1.0" encoding="UTF-8"?> <persons> <person id="23"> <name>李老师</name> <age>23</age> </person> <person id = "24"> <name>张老师</name> <age>26</age> </person> </persons> 一.客户端。 新建一个java project。 因为pull不是系统自带的,要使用pull解析,需要网上下载第三方pull解析器,本例使用kxml2-2.2.2.jar包 1)新建一个person类,用来存储person属性。 2)新建一个PullXmlParser类,添加parserXML函数,用来解析xml文件,并存入到list中,list中存入的是person类对象。 3)HttpUtils类,使用http的get方式从服务器获取xml的IO流。具体使用上一节sax方式解析xml的httpUtils文件即可。 4)测试类。 person.java内容如下: public class person { public person() { // TODO Auto-generated constructor stub } //成员变量 private String name = null; private int id = 0; private int age = 0; //有参构造函数 public person(String name,int id,int age) { super(); this.name = name; this.id = id; this.age = age; } //get函数 public String getName() { return name; } //set函数 public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //toString()函数 @Override public String toString() { return "person [name=" + name + ",id=" + id + ",age=" + age + "]"; } } PullXmlParser.java内容如下,pull核心: public class PullXmlTools { public PullXmlTools() { // TODO Auto-generated constructor stub } /** * 想要给函数添加类似于这样的注释,可以在上方输入“/**”,然后点击回车即可 * @param inputStream从服务器获取xml,以流的方式返回 * @param encode * @return */ public static List<person> parseXML(InputStream inputStream,String encode){ List<person>list = null; //装载解析每一个person节点的内容 person personPerson = null; //创建一个xml解析的工厂 try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); //获得xml解析类的引用 XmlPullParser parser = factory.newPullParser(); parser.setInput(inputStream,encode); //获得事件的类型 int eventType = parser.getEventType(); //如果当前节点获得的事件类型不是文件结束符时 //END_DECUMENT类似于</persons> while (eventType!=XmlPullParser.END_DOCUMENT) { switch (eventType) { //相当于<persons> case XmlPullParser.START_DOCUMENT: list = new ArrayList<person>(); break; //相当于<person> case XmlPullParser.START_TAG: if("person".equals(parser.getName())){ personPerson = new person(); //取出属性值 //getAttributeName(0)意思是第一个属性值 //System.out.print(parser.getAttributeName(0));这个获取的是"id" int id = Integer.parseInt(parser.getAttributeValue(0)); personPerson.setId(id); }else if ("name".equals(parser.getName())) { String name = parser.nextText(); personPerson.setName(name); }else if ("age".equals(parser.getName())) { int age = Integer.parseInt(parser.nextText()); personPerson.setAge(age); } break; //相当于</person> case XmlPullParser.END_TAG: if("person".equals(parser.getName())){ list.add(personPerson); //解析到</person>后,要重新执行下一个<person>,在START_TAG下会重新new一个person对象出来 personPerson = null; } break; } eventType = parser.next(); } return list; } catch (XmlPullParserException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; } } HttpUtils.java从上一节sax解析xml文件拷贝即可。
test.java文件内容如下:和上一节内容类似: public static void main(String[] args) { String pathString = "http://localhost:8080/myhttp/person.xml"; //从服务器中获取InputStream流 InputStream inputStream = HttpUtils.getXML(pathString); try { //把获取到的inputstream流存入list中 List<person> list = PullXmlTools.parseXML(inputStream,"utf-8"); //循环输出 for(person person : list) { System.out.println(person.toString()); } } catch (Exception e) { // TODO: handle exception } } 输出结果如下:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |