zoukankan      html  css  js  c++  java
  • Android Xml解析

    在Android程序中,Xml解析与Java中几乎相同,最常用的有SAX,DOM,PULL 三种解析方式。Android中内置了pull解析方式。这也是android推荐的解析方式。下面我们就看下这三种的用法,与不同

    1)SAX:(Simple API for XML这种解析方式基于事件的模型。通俗的讲就是XML文件在加载的过程中,加载到不同节点会相应触发不同方法来处理。它属于一次加载。它可以处理任意大小的XML文件,它对内存的要求非常低,因为SAX采用的是读取文件的方式,也就是当它是文本文件在读,读完就完了,什么信息都没有保存。当然它也有其缺点,解析过程中无法中断,只能读取XML文件而不能修改,编码上也相对复杂与难于理解。它的常用方法:

    void startDocument()//文档开始时触发该方法

    void endDocument()//文档结束时

    void startElement(String uri, String localName, String qName, Attributes atts)//元素开始

    void endElement(String uri, String localName, String qName)//元素结束

    void characters(char[ ] ch, int start, int length)//文本节点

    创建SAX解析器:

      (1)用系统默认值来创建一个XMLReader(解析器):

      XMLReader reader = XMLReaderFactory.createXMLReader();

      (2)从给定的类名称来创建一个XMLReader :

      XMLReader reader = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");

      (3)使用javax.xml.parsers包中的SAXParserFactory类和SAXParser类创建:

      SAXParserFactory spFactory = SAXParserFactory.newInstance();

    SAXParser sParser = spFactory.newSAXParser();

    2)DOM:(Document Object Model文档对象模型,它是基于对象的,又或者基于树的。它属于两次加载,首先把文档载入内存,第二次把文档解析形成一棵树。如果文档过大对内存占用是很大的。但它也有其优点,它可以解析的过程中修改文件树,可以随便存储文件树的任意部分,相对容易理解。

    3)Pull解析:android中内置了pull解析包。这也是android程序中所推荐的xml解析方式。从它的字面上就可以看出来,其优点,pull,拉的意思。我要什么资源我就拿什么资源。我只需要xml文件中一部分,我就拉一部分。从而节省资源,提高效率。当然在J2EE中也可以使用Pull解析。Pull解析也非常易于理解。

     

    先上图:

    我们就用这三种方式对同一个XML文件进行解析:

    Xml代码  
    1. <?xml version="1.0"?>  
    2.     <persons>  
    3.         <person id="1">  
    4.             <name>tom</name>  
    5.             <age>13</age>  
    6.         </person>  
    7.         <person id="2">  
    8.             <name>jerry</name>  
    9.             <age>14</age>  
    10.         </person>  
    11.         <person id="3">  
    12.             <name>john</name>  
    13.             <age>34</age>  
    14.         </person>  
    15.     </persons>  

     SAX解析代码:

    Java代码  
    1. package com.iteye.androidtoast.resolver;  
    2.   
    3.   
    4. import java.io.InputStream;  
    5. import java.util.ArrayList;  
    6. import java.util.List;  
    7.   
    8. import javax.xml.parsers.SAXParser;  
    9. import javax.xml.parsers.SAXParserFactory;  
    10.   
    11. import org.xml.sax.Attributes;  
    12. import org.xml.sax.SAXException;  
    13. import org.xml.sax.helpers.DefaultHandler;  
    14.   
    15. import android.util.Log;  
    16.   
    17. import com.iteye.androidtaost.model.Person;  
    18. import com.iteye.androidtaost.service.ParseService;  
    19.   
    20. public class Sax implements ParseService{  
    21.     /*SAX解析,是基于事件的,一次性加载*/  
    22.     private SAXParser parser;  
    23.       
    24.     public Sax(){  
    25.         //实例化解析工厂  
    26.         SAXParserFactory f=SAXParserFactory.newInstance();  
    27.         try {  
    28.             parser=f.newSAXParser();  
    29.         } catch (Exception e) {  
    30.             e.printStackTrace();  
    31.             Log.i("Sax",e.getMessage());  
    32.         }  
    33.     }  
    34.     @Override  
    35.     public List<Person> doParse(InputStream in) {  
    36.         XmlHandler h=new XmlHandler();  
    37.         try {  
    38.             parser.parse(in, h);  
    39.         } catch (Exception e) {  
    40.             // TODO Auto-generated catch block  
    41.             e.printStackTrace();  
    42.         }   
    43.         return h.getPersons();  
    44.     }  
    45.       
    46.     /* 
    47.      * 处理器 
    48.      */  
    49.     class XmlHandler extends DefaultHandler{  
    50.         List<Person> persons=null;  
    51.         private Person p;  
    52.         private Object currentEleName;  
    53.           
    54.           
    55.         /** 
    56.          * 开始解析文档的时候实例化集合 
    57.          */  
    58.         @Override  
    59.         public void startDocument() throws SAXException {  
    60.             persons=new ArrayList<Person>();  
    61.         }  
    62.   
    63.         @Override  
    64.         public void endDocument() throws SAXException {  
    65.             // TODO Auto-generated method stub  
    66.             super.endDocument();  
    67.         }  
    68.   
    69.         /** 
    70.          * 元素开始 
    71.          */  
    72.         @Override  
    73.         public void startElement(String uri, String localName, String qName,  
    74.                 Attributes attributes) throws SAXException {  
    75.             if("person".equals(localName)){  
    76.                 p = new Person();//节点开始的时候实例化person  
    77.                 p.id=new Integer(attributes.getValue(0));//得到ID  
    78.             }else if("name".equals(localName)){  
    79.                 this.currentEleName="name";  
    80.             }else if("age".equals(localName)){  
    81.                 this.currentEleName="age";  
    82.             }  
    83.                   
    84.         }  
    85.   
    86.         /** 
    87.          * 元素结束事件 
    88.          */  
    89.         @Override  
    90.         public void endElement(String uri, String localName, String qName)  
    91.                 throws SAXException {  
    92.             //解析到文档末尾  
    93.             if("person".equals(localName)){  
    94.                 //将解析完成的对象添加到集合  
    95.                 persons.add(p);  
    96.             }else if("name".equals(localName)||"age".equals(localName)){  
    97.                 this.currentEleName="";  
    98.             }  
    99.         }  
    100.   
    101.         /**) 
    102.          * 用户处理字符节点 
    103.          */  
    104.         @Override  
    105.         public void characters(char[] ch, int start, int length)  
    106.                 throws SAXException {  
    107.             String str=new String(ch,start,length);  
    108.             if("name".equals(currentEleName)){  
    109.                 p.name=str;  
    110.             }else if("age".equals(currentEleName)){  
    111.                 p.age=new Integer(str);  
    112.             }  
    113.         }  
    114.           
    115.         public List<Person> getPersons(){  
    116.             return persons;  
    117.         }  
    118.           
    119.     }  
    120.       
    121. }  

     DOM解析代码:

    Java代码  
    1. package com.iteye.androidtoast.resolver;  
    2.   
    3. import java.io.IOException;  
    4. import java.io.InputStream;  
    5. import java.util.ArrayList;  
    6. import java.util.List;  
    7.   
    8. import javax.xml.parsers.DocumentBuilder;  
    9. import javax.xml.parsers.DocumentBuilderFactory;  
    10. import javax.xml.parsers.ParserConfigurationException;  
    11.   
    12. import org.w3c.dom.Document;  
    13. import org.w3c.dom.Element;  
    14. import org.w3c.dom.NodeList;  
    15. import org.xml.sax.SAXException;  
    16.   
    17. import com.iteye.androidtaost.model.Person;  
    18. import com.iteye.androidtaost.service.ParseService;  
    19. /* 
    20.  * DOM解析 
    21.  */  
    22. public class Dom implements ParseService{  
    23.   
    24.     /** 
    25.      * 文档构建器 
    26.      */  
    27.     private DocumentBuilder builder;  
    28.     private Person person;  
    29.       
    30.     public Dom(){  
    31.         //获取构建器  
    32.         DocumentBuilderFactory f=DocumentBuilderFactory.newInstance();  
    33.         try {  
    34.             builder=f.newDocumentBuilder();  
    35.         } catch (ParserConfigurationException e) {  
    36.             e.printStackTrace();  
    37.         }  
    38.     }  
    39.     @Override  
    40.     public List<Person> doParse(InputStream in) {  
    41.         List<Person> persons=new ArrayList<Person>();  
    42.         try {  
    43.             Document doc=builder.parse(in);  
    44.             NodeList list=doc.getElementsByTagName("person");  
    45.             for(int i=0;i<list.getLength();i++){  
    46.                 //提取Person元素  
    47.                 Element el=(Element) list.item(i);  
    48.                 person = new Person();  
    49.                 //获取ID节点  
    50.                 person.id=new Integer(el.getAttribute("id"));  
    51.                 person.name=getSubelementTextContentByName(el,"name");  
    52.                 person.age=new Integer(getSubelementTextContentByName(el,"age"));  
    53.                   
    54.                 persons.add(person);  
    55.             }  
    56.             return persons;  
    57.         } catch (SAXException e) {  
    58.             e.printStackTrace();  
    59.         } catch (IOException e) {  
    60.             e.printStackTrace();  
    61.         }  
    62.         return null;  
    63.     }  
    64.     /** 
    65.      * 得到指定元素的子元素文本 节点( 
    66.      * @param el 父元素 
    67.      * @param name 子元素名称  
    68.      * @return 
    69.      */  
    70.     private String getSubelementTextContentByName(Element el, String name) {  
    71.         NodeList list=el.getElementsByTagName(name);  
    72.         Element e=(Element) list.item(0);  
    73.         return e.getTextContent();   
    74.     }  
    75.   
    76.   
    77.   
    78. }  

     Pull解析代码:

    Java代码  
    1. package com.iteye.androidtoast.resolver;  
    2.   
    3. import java.io.IOException;  
    4. import java.io.InputStream;  
    5. import java.util.ArrayList;  
    6. import java.util.List;  
    7.   
    8. import org.xmlpull.v1.XmlPullParser;  
    9. import org.xmlpull.v1.XmlPullParserException;  
    10.   
    11. import android.util.Xml;  
    12.   
    13. import com.iteye.androidtaost.model.Person;  
    14. import com.iteye.androidtaost.service.ParseService;  
    15.   
    16. public class Pull implements ParseService{  
    17.   
    18.     private String tagName;  
    19.   
    20.     @Override  
    21.     public List<Person> doParse(InputStream in) {  
    22.         List<Person> persons=null;  
    23.         Person person=null;  
    24.           
    25.         XmlPullParser parser=Xml.newPullParser();  
    26.         try {  
    27.             parser.setInput(in, "utf-8");  
    28.             //获取事件类型  
    29.             int eventType=parser.getEventType();  
    30.               
    31.             while(eventType!=XmlPullParser.END_DOCUMENT){  
    32.                 switch(eventType){  
    33.                 //文档开始  
    34.                 case XmlPullParser.START_DOCUMENT:  
    35.                      persons=new ArrayList<Person>();  
    36.                      break;  
    37.                 case XmlPullParser.START_TAG:  
    38.                     tagName = parser.getName();  
    39.                     if("person".equals(tagName)){  
    40.                         person=new Person();  
    41.                         person.id=new Integer(parser.getAttributeValue(0));  
    42.                     }else if("name".equals(tagName)){  
    43.                         person.name=parser.nextText();  
    44.                     }else if("age".equals(tagName)){  
    45.                         person.age=new Integer(parser.nextText());  
    46.                     }  
    47.                     break;  
    48.                 case XmlPullParser.END_TAG:  
    49.                     if("person".equals(parser.getName())){  
    50.                         persons.add(person);  
    51.                     }  
    52.                     break;  
    53.                 }  
    54.                 eventType=parser.next();  
    55.             }  
    56.               
    57.         } catch (XmlPullParserException e) {  
    58.             // TODO Auto-generated catch block  
    59.             e.printStackTrace();  
    60.         } catch (IOException e) {  
    61.             // TODO Auto-generated catch block  
    62.             e.printStackTrace();  
    63.         }  
    64.         return persons;  
    65.     }  
    66.       
    67. 转载自http://androidtoast.iteye.com/blog/1187662
  • 相关阅读:
    VC 常见问题百问
    python windows 环境变量
    Check server headers and verify HTTP Status Codes
    Where are the AES 256bit cipher suites? Please someone help
    outlook 如何预订会议和会议室
    安装Axis2的eclipse插件后,未出现界面
    windows 环境变量
    python 时间日期处理汇集
    openldap学习笔记(使用openldap2.3.32)
    set p4 environment in windows
  • 原文地址:https://www.cnblogs.com/xuzhiwei/p/3334930.html
Copyright © 2011-2022 走看看