一、Sax解析(simple api for xml)node
使用流式處理的方式,它並不記錄所讀內容的相關信息。它是一種以事件爲驅動的XML API,解析速度快,佔用內存少。使用回調函數來實現。 android
1 class MyDefaultHander extends DefaultHandler{ 2 private List<Student> list; 3 private Student student; 4 5 @Override 6 public void startDocument() throws SAXException { 7 super.startDocument(); 8 list=new ArrayList<>(); 9 } 10 11 @Override 12 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 13 super.startElement(uri, localName, qName, attributes); 14 if(qName.equals("student")){ 15 student=new Student(); 16 17 } 18 preTag=qName; 19 } 20 21 @Override 22 public void endElement(String uri, String localName, String qName) throws SAXException { 23 if(qName.equals("student")){ 24 list.add(student); 25 } 26 preTag=null; 27 } 28 29 @Override 30 public void characters(char[] ch, int start, int length) throws SAXException { 31 if(preTag!=null){ 32 if(preTag.equals("id")){ 33 student.setId(Integer.parseInt(new String(ch,start,length))); 34 }else if(preTag.equals("name")){ 35 student.setName(new String(ch,start,length)); 36 }else if(preTag.equals("age")){ 37 student.setAge(Integer.parseInt(new String(ch,start,length))); 38 } 39 } 40 } 41 public List<Student> getStudents(){ 42 return list; 43 } 44 } 45 public List<Student> sax_parser(){ 46 List<Student> list=null; 47 try { 48 SAXParser parser= SAXParserFactory.newInstance().newSAXParser(); 49 InputStream is= getAssets().open("student.xml"); 50 MyDefaultHander hander=new MyDefaultHander(); 51 parser.parse(is,hander); 52 list= hander.getStudents(); 53 } catch (ParserConfigurationException e) { 54 e.printStackTrace(); 55 } catch (SAXException e) { 56 e.printStackTrace(); 57 } catch (IOException e) { 58 e.printStackTrace(); 59 } 60 return list; 61 }
二、Dom解析api
DOM(Document Object Model) 是一種用於XML文檔的對象模型,可用於直接訪問XML文檔的各個部分。它是一次性所有將內容加載在內存中,生成一個樹狀結構,它沒有涉及回調和複雜的狀態管理。 缺點是加載大文檔時效率低下。dom
1 public List<Student> DOM_parser(){ 2 DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance(); 3 List<Student> list=null; 4 try { 5 Document dom= factory.newDocumentBuilder().parse(getAssets().open("student.xml")); 6 Element element= dom.getDocumentElement(); 7 NodeList nodeList= element.getChildNodes(); 8 list=new ArrayList<>(); 9 for(int i=0;i<nodeList.getLength();i++){ 10 Log.i(TAG, "DOM_parser: "+nodeList.item(i).getNodeName()); 11 if(nodeList.item(i).getNodeName().equals("student")){ 12 NodeList childList= nodeList.item(i).getChildNodes(); 13 Student stu=new Student(); 14 for(int k=0;k<childList.getLength();k++){ 15 if(childList.item(k).getNodeName().equals("id")){ 16 stu.setId(Integer.parseInt(childList.item(k).getFirstChild().getNodeValue()));//注意直接getNodeValue()永遠返回null,需調用getFirsetChild()後調用getNodeValue() 17 }else if(childList.item(k).getNodeName().equals("name")){ 18 stu.setName(childList.item(k).getFirstChild().getNodeValue()); 19 }else if(childList.item(k).getNodeName().equals("age")){ 20 stu.setAge(Integer.parseInt(childList.item(k).getFirstChild().getNodeValue())); 21 } 22 } 23 list.add(stu); 24 } 25 } 26 } catch (SAXException e) { 27 e.printStackTrace(); 28 } catch (IOException e) { 29 e.printStackTrace(); 30 } catch (ParserConfigurationException e) { 31 e.printStackTrace(); 32 } 33 return list; 34 }
三、pull解析(android 推薦)ide
Pull內置於Android系統中。也是官方解析佈局文件所使用的方式。Pull與SAX有點相似,都提供了相似的事件,如開始元素和結束元素。不一樣的是,SAX的事件驅動是回調相應方法,須要提供回調的方法,然後在SAX內部自動調用相應的方法。而Pull解析器並無強制要求提供觸發的方法。由於他觸發的事件不是一個方法,而是一個數字。它使用方便,效率高。函數
1 public List<Student> Xml_pull_parser(){ 2 List<Student> list=null; 3 XmlPullParser parser= Xml.newPullParser(); 4 try { 5 parser.setInput(getAssets().open("student.xml"),"UTF-8"); 6 int event_code= parser.getEventType(); 7 Student student=null; 8 while (event_code!=XmlPullParser.END_DOCUMENT){ 9 switch (event_code){ 10 case XmlPullParser.START_DOCUMENT: 11 list=new ArrayList<>(); 12 break; 13 case XmlPullParser.START_TAG: 14 if(parser.getName().equals("student")){ 15 student=new Student(); 16 } 17 if(student!=null){ 18 if(parser.getName().equals("id")){ 19 // Log.i(TAG, "Xml_pull_parser: id="+parser.getText()); 20 student.setId( Integer.parseInt(parser.nextText())); 21 }else if(parser.getName().equals("name")){ 22 student.setName(parser.nextText()); 23 }else if(parser.getName().equals("age")){ 24 student.setAge(Integer.parseInt(parser.nextText())); 25 } 26 } 27 break; 28 case XmlPullParser.END_TAG: 29 if(parser.getName().equals("student")){ 30 list.add(student); 31 student=null; 32 } 33 break; 34 } 35 event_code= parser.next(); 36 37 } 38 } catch (XmlPullParserException e) { 39 e.printStackTrace(); 40 } catch (IOException e) { 41 e.printStackTrace(); 42 } 43 return list; 44 }