数据解析1:XML解析(3)

  XML解析的第二种方法是PULL解析

  PULL解析是以事件常量的的方法进行解析,何为事件常量

  当解析器从头到尾解析XML文件时,解析到文档开头定义为解析到一个常量XmlPullParser.START_DOCUMENT,当解析到开始标签定义为解析到一个常量XmlPullParser.START_TAG,当解析到结束标签定义为解析到一个常量XmlPullParser.END_TAG,当解析到文档结尾定义为解析到一个常量XmlPullParser.END_DOCUMENT。

  下面是PULL解析的过程:

 

  PULL解析的核心过程:

 1 public class PullPaser1 {
 2     
 3     public List<Person> pullParser() throws XmlPullParserException, IOException
 4     {
 5         List<Person> list = null;
 6         Person  person = null;
 7         
 8         //1.创建解析器工厂对象
 9         XmlPullParserFactory factory =XmlPullParserFactory.newInstance();
10         //2.创建解析器对象
11         XmlPullParser parser = factory.newPullParser();
12         //3.创建读取被解析的文件的字符读取流
13         //FileReader fileReader = new FileReader("user.xml");    
14         FileInputStream fis = new FileInputStream("user.xml");
15         parser.setInput(fis, "utf-8");//可以设置编码
16         //得到解析时返回的第一个编号
17         int event = parser.getEventType();
18         
19         //4.具体的解析过程
20         while(event!=XmlPullParser.END_DOCUMENT)
21         {
22             switch(event)
23             {
24                 case XmlPullParser.START_DOCUMENT:
25                     list = new ArrayList<Person>();break;
26                 case XmlPullParser.START_TAG:
27                     String tagName = parser.getName();//得到开始标签名称
28                     if("person".equals(tagName))
29                     {
30                         person = new Person();
31                     }
32                     else if("name".equals(tagName))
33                         person.setName(parser.nextText());//获取开始标签后边的数据
34                     else if("age".equals(tagName))
35                         person.setAge(Integer.parseInt(parser.nextText()));
36                     else if("sex".equals(tagName))
37                         person.setSex(parser.nextText());
38                     break;
39                 case XmlPullParser.END_TAG:
40                     if("person".equals(parser.getName()))
41                     {
42                         list.add(person);
43                     }
44                     break;                
45             }
46             //获取下一个编号
47             event = parser.next();
48         }
49         return list;
50     }
51 
52 }

 

  观察上面代码可知:PULL解析核心的过程和SAX解析很相似,对于SAX解析,是以事件通知的方法,即解析不同部分,调用不同的方法,而对于PULL解析,是以事件常量的方法,即解析不同部分,认为是不同的常量加以区分,执行不同的操作,而它们都需要先创建一个解析工厂,通过工厂来获取一个解析器对象。

  

  PULL解析的步骤

  1.获取PULL解析的工厂实例

    XmlPullParserFactory factory =XmlPullParserFactory.newInstance();

  2.通过工厂实例,获取PULL解析器对象

    XmlPullParser parser = factory.newPullParser();

  3.创建读取xml文件的流(若xml文件是本地),设置编码   

    FileInputStream fis = new FileInputStream("user.xml");
    parser.setInput(fis, "utf-8");//可以设置编码

  4.获取第一个事件常量,然后循环解析XML文件

     int event = parser.getEventType();   

     while(event!=XmlPullParser.END_DOCUMENT)
     {
      switch(event)
      {
        case XmlPullParser.START_DOCUMENT:

           ...
            break;
        case XmlPullParser.START_TAG:
            String tagName = parser.getName();//得到开始标签名称

            ....
            break;
        case XmlPullParser.END_TAG:

            ....
            break;
        }
       //获取下一个编号
      event = parser.next();
    }

 

  示例1:采用PULL解析user.xml文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <persons>
 3     <person>
 4         <name>张三</name>
 5         <age>30</age>
 6         <sex></sex>    
 7     </person>
 8     
 9     <person>
10         <name>李四</name>
11         <age>32</age>
12         <sex></sex>
13     </person>
14     
15     <person>
16         <name>王五</name>
17         <age>30</age>
18         <sex></sex>
19     </person>
20 </persons>
user.xml
 1 package com.qianfeng.pull1;
 2 
 3 public class Person {
 4     
 5     private String name;
 6     private int age;
 7     private String sex;
 8     
 9     public Person(){}
10 
11     public Person(String name, int age, String sex) {
12         super();
13         this.name = name;
14         this.age = age;
15         this.sex = sex;
16     }
17 
18     public String getName() {
19         return name;
20     }
21 
22     public void setName(String name) {
23         this.name = name;
24     }
25 
26     public int getAge() {
27         return age;
28     }
29 
30     public void setAge(int age) {
31         this.age = age;
32     }
33 
34     public String getSex() {
35         return sex;
36     }
37 
38     public void setSex(String sex) {
39         this.sex = sex;
40     }
41 
42     @Override
43     public String toString() {
44         return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
45     }
46     
47     
48 
49 }
Person.java
 1 package com.qianfeng.pull1;
 2 
 3 import java.io.FileInputStream;
 4 import java.io.FileNotFoundException;
 5 import java.io.FileReader;
 6 import java.io.IOException;
 7 import java.util.ArrayList;
 8 import java.util.List;
 9 
10 import org.xmlpull.v1.XmlPullParser;
11 import org.xmlpull.v1.XmlPullParserException;
12 import org.xmlpull.v1.XmlPullParserFactory;
13 
14 public class PullPaser1 {
15     
16     public List<Person> pullParser() throws XmlPullParserException, IOException
17     {
18         List<Person> list = null;
19         Person  person = null;
20         
21         //创建解析器工厂对象
22         XmlPullParserFactory factory =XmlPullParserFactory.newInstance();
23         //创建解析器对象
24         XmlPullParser parser = factory.newPullParser();
25         //创建读取被解析的文件的字符读取流
26         //FileReader fileReader = new FileReader("user.xml");    
27         FileInputStream fis = new FileInputStream("user.xml");
28         parser.setInput(fis, "utf-8");//可以设置编码
29         //得到解析时返回的第一个编号
30         int event = parser.getEventType();
31         
32         while(event!=XmlPullParser.END_DOCUMENT)
33         {
34             switch(event)
35             {
36                 case XmlPullParser.START_DOCUMENT:
37                     list = new ArrayList<Person>();break;
38                 case XmlPullParser.START_TAG:
39                     String tagName = parser.getName();//得到开始标签名称
40                     if("person".equals(tagName))
41                     {
42                         person = new Person();
43                     }
44                     else if("name".equals(tagName))
45                         person.setName(parser.nextText());//获取开始标签后边的数据
46                     else if("age".equals(tagName))
47                         person.setAge(Integer.parseInt(parser.nextText()));
48                     else if("sex".equals(tagName))
49                         person.setSex(parser.nextText());
50                     break;
51                 case XmlPullParser.END_TAG:
52                     if("person".equals(parser.getName()))
53                     {
54                         list.add(person);
55                     }
56                     break;                
57             }
58             //获取下一个编号
59             event = parser.next();
60         }
61         return list;
62     }
63 
64 }
PullPaser1
 1 package com.qianfeng.pull1;
 2 
 3 import java.io.IOException;
 4 import java.util.List;
 5 
 6 import org.xmlpull.v1.XmlPullParser;
 7 import org.xmlpull.v1.XmlPullParserException;
 8 
 9 public class Test {
10 
11     /**
12      * @param args
13      * @throws IOException 
14      * @throws XmlPullParserException 
15      */
16     public static void main(String[] args) throws XmlPullParserException, IOException {        
17 //        System.out.println(XmlPullParser.START_DOCUMENT);
18 //        System.out.println(XmlPullParser.START_TAG);
19 //        System.out.println(XmlPullParser.TEXT);
20 //        System.out.println(XmlPullParser.END_TAG);
21 //        System.out.println(XmlPullParser.END_DOCUMENT);
22         
23         
24         PullPaser1 pullParser1 = new PullPaser1();
25         List<Person> list = pullParser1.pullParser();
26         
27         for(Person person:list)
28         {
29             System.out.println(person);
30         }
31 
32     }
33 
34 }
Test.java

  示例2:采用PULL解析worker.xml文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <workers>
 3     <worker id="AQ01">
 4         <name>Mark</name>
 5         <sex>男</sex>
 6         <status>经理</status>
 7         <address>北京</address>
 8         <money>4000</money>
 9     </worker>
10     <worker id="AD02">
11         <name>Luch</name>
12         <sex>女</sex>
13         <status>员工</status>
14         <address>上海</address>
15         <money>1000</money>
16     </worker>
17     <worker id="AD03">
18         <name>Lily</name>
19         <sex>女</sex>
20         <status>员工</status>
21         <address>北京</address>
22         <money>2000</money>
23     </worker>
24     <worker>
25         <name>Lily</name>
26         <sex>女</sex>
27         <status>员工</status>
28         <address>北京</address>
29         <money>2000</money>
30     </worker>
31 </workers>
worker.xml
 1 package com.qianfeng.pull2;
 2 
 3 public class Worker {
 4     
 5      private String id;
 6      private String name;
 7      private char sex;
 8      private String status;
 9      private String address;
10      private double money;
11      
12      public Worker(){}
13 
14     public Worker(String id, String name, char sex, String status,
15             String address, double money) {
16         super();
17         this.id = id;
18         this.name = name;
19         this.sex = sex;
20         this.status = status;
21         this.address = address;
22         this.money = money;
23     }
24 
25     public String getId() {
26         return id;
27     }
28 
29     public void setId(String id) {
30         this.id = id;
31     }
32 
33     public String getName() {
34         return name;
35     }
36 
37     public void setName(String name) {
38         this.name = name;
39     }
40 
41     public char getSex() {
42         return sex;
43     }
44 
45     public void setSex(char sex) {
46         this.sex = sex;
47     }
48 
49     public String getStatus() {
50         return status;
51     }
52 
53     public void setStatus(String status) {
54         this.status = status;
55     }
56 
57     public String getAddress() {
58         return address;
59     }
60 
61     public void setAddress(String address) {
62         this.address = address;
63     }
64 
65     public double getMoney() {
66         return money;
67     }
68 
69     public void setMoney(double money) {
70         this.money = money;
71     }
72 
73     @Override
74     public String toString() {
75         return "Worker [id=" + id + ", name=" + name + ", sex=" + sex
76                 + ", status=" + status + ", address=" + address + ", money="
77                 + money + "]";
78     }
79      
80      
81 
82 }
Worker.java
 1 package com.qianfeng.pull2;
 2 
 3 import java.io.FileInputStream;
 4 import java.io.FileNotFoundException;
 5 import java.io.IOException;
 6 import java.util.ArrayList;
 7 import java.util.List;
 8 
 9 import org.xmlpull.v1.XmlPullParser;
10 import org.xmlpull.v1.XmlPullParserException;
11 import org.xmlpull.v1.XmlPullParserFactory;
12 
13 public class PullParser2 {
14     
15     public List<Worker> pullParser() throws XmlPullParserException, IOException
16     {
17         List<Worker> list = null;
18         Worker worker = null;
19         
20         XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
21         XmlPullParser parser = factory.newPullParser();
22         
23         FileInputStream fis = new FileInputStream("worker.xml");
24         
25         parser.setInput(fis, "utf-8");
26         
27         int event = parser.getEventType();
28         
29         while(event!=XmlPullParser.END_DOCUMENT){
30             switch(event)
31             {
32             case XmlPullParser.START_DOCUMENT:
33                 list = new ArrayList<Worker>();
34                 break;
35             case XmlPullParser.START_TAG:
36                 String tagName = parser.getName();
37                 if("worker".equals(tagName))
38                 {
39                     worker = new Worker();
40                     int count = parser.getAttributeCount();//得到属性数量
41                     for(int i=0;i<count;i++)
42                     {
43                         //得到属性名
44                         String attrName = parser.getAttributeName(i);
45                         //得到属性值
46                         String attrValue = parser.getAttributeValue(i);
47                         
48                         if("id".equals(attrName))
49                         {
50                             worker.setId(attrValue);
51                         }
52                     }
53                 }
54                 else if("name".equals(tagName))
55                     worker.setName(parser.nextText());
56                 else if("sex".equals(tagName))
57                     worker.setSex(parser.nextText().charAt(0));
58                 else if("status".equals(tagName))
59                     worker.setStatus(parser.nextText());
60                 else if("address".equals(tagName))
61                     worker.setAddress(parser.nextText());
62                 else if("money".equals(tagName))
63                     worker.setMoney(Double.parseDouble(parser.nextText()));
64                 break;
65             case XmlPullParser.END_TAG:
66                 if("worker".equals(parser.getName()))
67                 {
68                     list.add(worker);
69                 }
70                 break;
71                 
72             }
73             event = parser.next();
74         }
75         
76         return list;
77     }
78 
79 }
PullParser2
 1 package com.qianfeng.pull2;
 2 
 3 import java.io.IOException;
 4 import java.util.List;
 5 
 6 import org.xmlpull.v1.XmlPullParserException;
 7 
 8 public class Test {
 9 
10     /**
11      * @param args
12      * @throws IOException 
13      * @throws XmlPullParserException 
14      */
15     public static void main(String[] args) throws XmlPullParserException, IOException {
16         
17         PullParser2  pullParser2 = new PullParser2();
18         
19         List<Worker> list = pullParser2.pullParser();
20         
21         for(Worker worker:list)
22         {
23             System.out.println(worker);
24         }
25 
26     }
27 
28 }
Test.java

  示例3:上次采用了SAX解析了citys_weather.xml,这次用PULL解析比较复杂的xml文件

  citys_weather.xml文件见上篇数据解析1:XML解析(2)

 1 package com.qianfeng.pull4;
 2 
 3 import java.util.List;
 4 
 5 public class Province {
 6     
 7     private String id;
 8     private String name;
 9     private List<City> citys;
10     
11     public Province(){}
12 
13     public Province(String id, String name, List<City> citys) {
14         super();
15         this.id = id;
16         this.name = name;
17         this.citys = citys;
18     }
19 
20     public String getId() {
21         return id;
22     }
23 
24     public void setId(String id) {
25         this.id = id;
26     }
27 
28     public String getName() {
29         return name;
30     }
31 
32     public void setName(String name) {
33         this.name = name;
34     }
35 
36     public List<City> getCitys() {
37         return citys;
38     }
39 
40     public void setCitys(List<City> citys) {
41         this.citys = citys;
42     }
43 
44     @Override
45     public String toString() {
46         return name;
47     }
48     
49     
50     
51 
52 }
Province.java
 1 package com.qianfeng.pull4;
 2 
 3 import java.util.List;
 4 
 5 public class City {
 6     
 7     private String id;
 8     private String name;
 9     private List<District> districts;
10     
11     public City(){}
12 
13     public City(String id, String name, List<District> districts) {
14         super();
15         this.id = id;
16         this.name = name;
17         this.districts = districts;
18     }
19 
20     public String getId() {
21         return id;
22     }
23 
24     public void setId(String id) {
25         this.id = id;
26     }
27 
28     public String getName() {
29         return name;
30     }
31 
32     public void setName(String name) {
33         this.name = name;
34     }
35 
36     public List<District> getDistricts() {
37         return districts;
38     }
39 
40     public void setDistricts(List<District> districts) {
41         this.districts = districts;
42     }
43 
44     @Override
45     public String toString() {
46         return name;
47     }
48     
49     
50 
51 }
City.java
 1 package com.qianfeng.pull4;
 2 
 3 public class District {
 4     
 5     private String id;
 6     private String name;
 7     
 8     public District(){}
 9 
10     public District(String id, String name) {
11         super();
12         this.id = id;
13         this.name = name;
14     }
15 
16     public String getId() {
17         return id;
18     }
19 
20     public void setId(String id) {
21         this.id = id;
22     }
23 
24     public String getName() {
25         return name;
26     }
27 
28     public void setName(String name) {
29         this.name = name;
30     }
31 
32     @Override
33     public String toString() {
34         return name;
35     }
36     
37     
38 
39 }
District.java
  1 package com.qianfeng.pull4;
  2 
  3 import java.io.FileInputStream;
  4 import java.io.FileNotFoundException;
  5 import java.io.IOException;
  6 import java.util.ArrayList;
  7 import java.util.List;
  8 
  9 import org.xmlpull.v1.XmlPullParser;
 10 import org.xmlpull.v1.XmlPullParserException;
 11 import org.xmlpull.v1.XmlPullParserFactory;
 12 
 13 public class PullParser4 {
 14     
 15     public List<Province> pullParser() throws XmlPullParserException, IOException
 16     {
 17         List<Province> provinces = null;
 18         Province province = null;
 19         List<City> citys = null;
 20         City city = null;
 21         List<District> districts = null;
 22         District district = null;
 23         
 24         XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
 25         XmlPullParser parser = factory.newPullParser();
 26         
 27         FileInputStream fis = new FileInputStream("citys_weather.xml");
 28         
 29         parser.setInput(fis, "utf-8");
 30         int event = parser.getEventType();
 31         while(event!=XmlPullParser.END_DOCUMENT)
 32         {
 33             switch(event)
 34             {
 35             case XmlPullParser.START_DOCUMENT:
 36                 provinces = new ArrayList<Province>();break;
 37             case XmlPullParser.START_TAG:
 38                 String tagName = parser.getName();
 39                 if("p".equals(tagName))
 40                 {
 41                     province = new Province();
 42                     citys = new ArrayList<City>();
 43                     int count = parser.getAttributeCount();
 44                     for(int i=0;i<count;i++)
 45                     {
 46                         String attrName = parser.getAttributeName(i);
 47                         String attrValue = parser.getAttributeValue(i);
 48                         if("p_id".equals(attrName))
 49                         {
 50                             province.setId(attrValue);
 51                         }
 52                     }
 53                 }
 54                 if("pn".equals(tagName))
 55                     province.setName(parser.nextText());
 56                 if("c".equals(tagName))
 57                 {
 58                     city = new City();
 59                     districts = new ArrayList<District>();
 60                     int count = parser.getAttributeCount();
 61                     for(int i=0;i<count;i++)
 62                     {
 63                         String atrrName = parser.getAttributeName(i);
 64                         String attrValue = parser.getAttributeValue(i);
 65                         if("c_id".equals(atrrName))
 66                             city.setId(attrValue);
 67                     }
 68                 }
 69                 if("cn".equals(tagName))
 70                     city.setName(parser.nextText());
 71                 if("d".equals(tagName))
 72                 {
 73                     district = new District();
 74                     int count = parser.getAttributeCount();
 75                     for(int i=0;i<count;i++)
 76                     {
 77                         String atrrName = parser.getAttributeName(i);
 78                         String attrValue = parser.getAttributeValue(i);
 79                         if("d_id".equals(atrrName))
 80                             district.setId(attrValue);
 81                     }
 82                     district.setName(parser.nextText());
 83                     districts.add(district);
 84                 }
 85                 break;
 86             case XmlPullParser.END_TAG:
 87                 if("c".equals(parser.getName()))
 88                 {
 89                     city.setDistricts(districts);
 90                     citys.add(city);
 91                 }
 92                 if("p".equals(parser.getName()))
 93                 {
 94                     province.setCitys(citys);
 95                     provinces.add(province);
 96                 }
 97                 break;
 98             }
 99             event = parser.next();
100         }
101         return provinces;
102     }
103 
104 }
PullParser4
 1 package com.qianfeng.pull4;
 2 
 3 import java.io.IOException;
 4 import java.util.List;
 5 
 6 import org.xmlpull.v1.XmlPullParserException;
 7 
 8 public class Test {
 9 
10     /**
11      * @param args
12      * @throws IOException 
13      * @throws XmlPullParserException 
14      */
15     public static void main(String[] args) throws XmlPullParserException, IOException {
16         
17         PullParser4 pullParser4 = new PullParser4();
18         
19         List<Province> list =pullParser4.pullParser();
20         
21         for(int i=0;i<list.size();i++)
22         {
23             Province province = list.get(i);
24             System.out.println("省:"+province);
25             List<City> citys = province.getCitys();
26             for(int j=0;j<citys.size();j++)
27             {
28                 City city = citys.get(j);
29                 System.out.println("市===:"+city);
30                 List<District> districts = city.getDistricts();
31                 for(int k =0;k<districts.size();k++)
32                 {
33                     District district =districts.get(k);
34                     System.out.println("县=======:"+district);
35                 }
36             }
37         }
38         
39         
40 
41     }
42 
43 }
Test

 

  未完,待续。

 

posted on 2015-09-17 10:14  AellenLei  阅读(158)  评论(0编辑  收藏  举报

导航