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