• 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
  • 相关阅读:
    2021.02.09 【ABAP随笔】-Excel高效输出工具-xlsx workbench-输出多个Sheet
    2021.02.07 【ABAP随笔】-Excel高效输出工具-xlsx workbench
    Thrift did not exit cleanly
    Docker部署Springboot项目,Invalid or corrupt jarfile /app.jar
    为jenkins设置nginx作为反向代理
    Jenkins安装报错 No valid crumb was included in request
    判断当前设备是ios还是安卓
    vue 路由跳转四种方式 (带参数)
    Vue table的column属性,render函数生成switch开关和button按钮
    H5页面自定义 pxTorem 函数进行单位转换
  • 原文地址:https://www.cnblogs.com/xuzhiwei/p/3334930.html
Copyright © 2020-2023  润新知