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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM