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);
                  }
         }

打印:

 

 

 

 

 

posted @ 2019-12-12 14:13  诺谦  阅读(832)  评论(0编辑  收藏  举报