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     }

 

posted on 2017-02-04 22:29  向着大牛奋斗  阅读(9408)  评论(0编辑  收藏  举报