• 数据解析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

      未完,待续。

  • 相关阅读:
    Flume实现写入es
    JMeter创建上传文件脚本
    JQuery的dataTable实现分页
    Dubbo服务发布机制-源码学习
    spring容器启动过程(Spring源码阅读)
    Hadoop学习笔记一(HDFS架构)
    hbase修改表TTL
    hive复制表
    提交docker镜像到远程仓库
    centos7 安装ssh
  • 原文地址:https://www.cnblogs.com/enjoy-coding/p/4815347.html
Copyright © 2020-2023  润新知