XML解析(pull解析)

 1 public class PullTool {
 2 
 3     //写一个解析XML文件的方法
 4     /**
 5      * 返回值:List<Student>
 6      * 参数:InputStream is
 7      * 注意 工具类中的方法写成静态
 8      * @throws XmlPullParserException 
 9      */
10     public static List<Student> parserXml(InputStream is) throws Exception{
11         //A.初始化集合以及Student对象
12         List<Student> list = null;
13         Student stu = null;
14         //B.创建生产XML的pull解析器的工厂
15         XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
16         //C.使用工厂获取pull解析器
17         XmlPullParser parser = factory.newPullParser();
18         //D.使用解析器读取当前的xml流
19         parser.setInput(is, "UTF-8");    //传入InputStream对象 并且设置解码规则需和XML文档中设置的一致
20         //E.获取当前事件的状态
21         int type = parser.getEventType(); 
22         /**
23          * 我们知道pull解析是以事件为单位解析的因此我们要获取一开始的解析标记type,之后通过type判断循环来读取文档
24          * 注意:当解析器开始读取is的时候已经开始了,指针type在xml的第一行开始。pull解析是指针从第一行开始读取到最后一行以事件为单位读取的解析方式
25          */
26         //F.通过while循环判断是否读取到了文档结束
27         while(type != parser.END_DOCUMENT){
28             
29             switch (type) {
30             case XmlPullParser.START_TAG:
31                 //判断当前遇到的元素名称是否为students
32                 if("students".equals(parser.getName())){
33                     list = new ArrayList<Student>();
34                 }else if("student".equals(parser.getName())){
35                     //初始化Student对象
36                     stu = new Student();
37                     //读取number属性
38                     String number = parser.getAttributeValue(null,"number");   
39                     //String number = parser.getAttributeValue(0);     也可以通过索引获取 这边只有一个属性number 
40                     //xml解析获得标签属性值:parser.getAttributeValue(null,"cityname")//null:固定值;cityname:属性的名字
41                     
42                     stu.setNumber(number);  //将数据封装到学生类中
43                 }else if("name".equals(parser.getName())){
44                     String name =  parser.nextText();    //xml解析获得文本属性parser.nextText();   注意:这边if条件中获取的是name标签开始的位置 因此用nextText()方法获取标签体内容
45                     stu.setName(name);
46                 }else if("sex".equals(parser.getName())){
47                     String sex =  parser.nextText();
48                     stu.setSex(sex);
49                 }else if("age".equals(parser.getName())){
50                     int  age =  Integer.parseInt(parser.nextText());
51                     stu.setAge(age);
52                 }
53                 
54                 break;
55             case XmlPullParser.END_TAG:
56                 if("student".equals(parser.getName())){
57                     list.add(stu);
58                     stu = null;
59                 }
60                 break;
61             default:
62                 break;
63             }
64             
65             //让解析器向下解析一行,并返回改行的事件常量  这样配合while(type != parser.END_DOCUMENT)读取完整个文档
66             type = parser.next();
67             
68             
69         }
70         return list;
71     }
72     
73     public static void main(String[] args) throws Exception {
74         FileInputStream is = new FileInputStream("src/stu.xml");
75         
76         List<Student> list = PullTool.parserXml(is);
77         
78         System.out.println(list);
79         
80         is.close();
81         
82         
83         
84     }
85 }

Pull解析
与Sax一样.都属于事件驱动的解析方式.
相比Sax解析过程更加灵活.
sax一旦开始解析就是从头读到尾.不解析完整个文档不会停
pull解析较为灵活.是以事件为单位.手动向下继续. 如果获得到我们要找的内容. 可以停止继续解析.

对象的种类

Document         整个xml文档对象

Element          文档中的标签对象

Atritube          标签中的属性对象

Text                              标签体的内容的对象

Common         注释对象

常用事件

START_DOCUMENT    文档开始

END_DOCUMENT      文档结束 

START_TAG         元素开始

END_TAG         元素结束

 常用方法

1.xml解析获得标签属性值:

String number = parser.getAttributeValue(0);   //通过索引获取 这边只有一个属性number
String number =parser.getAttributeValue(null,"cityname");  //null:固定值;cityname:属性的名字

2.获得开始标签之后的标签体内容

 if("name".equals(parser.getName())){     //解析到了name开始标签就获取值
String name = parser.nextText();           //xml解析获得文本属性parser.nextText(); 注意:这边if条件中获取的是name标签开始的位置 因此用nextText()方法获取标签体内容
stu.setName(name);
}

 

posted @ 2016-10-20 15:43  烟火里的尘埃丶  阅读(4920)  评论(0编辑  收藏  举报