18.JAVA-pull解析XML
1.pull解析介绍
pull解析其实和我们上章学的sax解析原理非常类似,在Android中非常常用.
在java中,需自己获取xmlpull所依赖的类库分别为:kxml2-2.3.0.jar,xmlpull_1_1_3_4c.jar。
pull和sax区别
- sax: 被动解析,一旦解析,则必须等待解析完成,不能控制事件的处理主动结束。
- pull: 主动解析, 比SAX会更加灵活,因此可以在满足了需要的条件后停止解析,不再获取事件.
2.pull解析步骤
- 获取XmlPullParser解析器,通过XmlPullParserFactory工厂类获取
- 通过XmlPullParser. setInput(new FileInputStream (),"utf-8")设置解析器的输入文件以及格式
- 然后通过XmlPullParser.getEventType()一直while获取当前事件类型(文档开头/元素开头/内容/文档结束等).然后通过getName()等方法获取元素名、内容等,直到遇到END_DOCUMENT(文档结束)退出.
XmlPullParser中常用方法如下:
getName(); //获取当前元素名 getTextCharacters(); //获取当前内容(当getEventType ()==TEXT时通过这个来获取元素内容) nextText(); //获取下个内容(当getEventType ()==START_TAG时通过这个来获取元素内容)
3.persons.xml示例如下
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <persons> <person> <姓名>张三</姓名> <性别>男</性别> <年龄>99</年龄> </person> <person> <姓名>李四</姓名> <性别>男</性别> <年龄>17</年龄> </person> </persons>
4.代码如下
@Test public void PullParseXml() throws Exception{ ArrayList<Person> list = null; Person person = null; //1.获取XmlPullParser解析器,通过XmlPullParserFactory工厂类获取 XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance(); XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser(); //2.设置解析器的输入文件以及格式 xmlPullParser.setInput(new FileInputStream(new File("src//persons.xml")),"utf-8"); //3.while获取当前事件类型.然后获取元素名、内容等,直到遇到END_DOCUMENT(文档结束)退出. int type = xmlPullParser.getEventType(); while(type!=xmlPullParser.END_DOCUMENT) { if(type==xmlPullParser.START_TAG) //开始元素 { if("persons".equals(xmlPullParser.getName())) { list = new ArrayList<Person>(); } else if("person".equals(xmlPullParser.getName())) { person = new Person(); } else if("姓名".equals(xmlPullParser.getName())) { person.setName(xmlPullParser.nextText()); } else if("性别".equals(xmlPullParser.getName())) { person.setSex(xmlPullParser.nextText()); } else if("年龄".equals(xmlPullParser.getName())) { person.setAge(xmlPullParser.nextText()); } } else if(type==xmlPullParser.END_TAG) //结束元素 { if("person".equals(xmlPullParser.getName())) { list.add(person); } } type = xmlPullParser.next(); } //打印: for(Person person1:list){ System.out.println(person1); } }
打印:
人间有真情,人间有真爱。