1、Sax解析(simple api for xml)
使用流式处理的方式,它并不记录所读内容的相关信息。它是一种以事件为驱动的XML API,解析速度快,占用内存少。使用回调函数来实现。
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 }
2、Dom解析
DOM(Document Object Model) 是一种用于XML文档的对象模型,可用于直接访问XML文档的各个部分。它是一次性全部将内容加载在内存中,生成一个树状结构,它没有涉及回调和复杂的状态管理。 缺点是加载大文档时效率低下。
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 }
3、pull解析(android 推荐)
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 }