Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> [安卓筆記]安卓下xml文件的解析

[安卓筆記]安卓下xml文件的解析

編輯:關於Android編程

安卓下解析xml文件有多種方式: dom:

通用性強,它會將XML文件的所有內容讀取到內存中,然後允許您使用DOM API遍歷XML樹、檢索所需的數據;簡單直觀,但需要將文檔讀取到內存,並不太適合移動設備

sax:

 

SAX是一個解析速度快並且占用內存少的xml解析 器;采用事件驅動,它並不需要解析整個文檔;實現:繼承DefaultHandler,覆寫startElement、endElement、characters等方法;

 

pull: Android自帶的XML解析器,和SAX基本類似,也是事件驅動,不同的是PULL事件返回的是數值型;推薦使用。 -------------------------------------------------------------------------- 下面介紹pull解析和sax解析xml的方式,dom一般不會在移動設備上使用,故略去。 -------------------------------------------------------------------------- 一.pull解析: 1.需要使用的類:
android.util.Xml
org.xmlpull.v1.XmlSerializer
org.xmlpull.v1.XmlPullParser

2.是否需要額外jar包支持:否 3.使用方式: 1.創建xml: a. 創建xmlSerializer對象
 XmlSerializer serializer = Xml.newSerializer();
b.設置輸出流
 serializer.setOutput(outputstream,encoding)
c.開始創建xml文檔並添加節點
serializer.startDocument("utf-8",true);
serializer.startTag(null,node_name);
...
serializer.endTag(null,node_name);
serializer.endDocument();
2.解析xml: a.創建xmlPullParser對象
XmlPullParser parser = Xml.newPullParser();
b.設置輸入流
parser.setInput(inputstream,encoding);
c.解析
int type = parser.getEventType();
while(type != XmlPullParser.END_DOCUMENT)
{
    switch (type)
    {
   case XmlPullParser.START_TAG:
      break;
   case XmlPullParser.END_TAG: 
      break;
     } 
   type = parser.next();//一定別忘了這句代碼
 }
4.實例
/**
     * 使用XmlSerializer生成xml文件
     */
    private void makeXML()
    {
        List citys = Data.getCityData();
        try
        {
            File path = Environment.getExternalStorageDirectory();
            XmlSerializer serializer = Xml.newSerializer();
            serializer.setOutput(new FileOutputStream(new File(path,"weather.xml")),"utf-8");
        
            serializer.startDocument("utf-8",true);
            serializer.startTag(null,"info");
            
            for(WeatherData city : citys)
            {
                serializer.startTag(null,"city");
                serializer.attribute(null,"id",city.getId());
                serializer.attribute(null,"name",city.getName());
                
                serializer.startTag(null,"weather");
                serializer.text(city.getWeather());
                serializer.endTag(null,"weather");
                
                serializer.startTag(null,"temp");
                serializer.text(city.getTemp());
                serializer.endTag(null,"temp");
                
                serializer.startTag(null,"wind");
                serializer.text(city.getWind());
                serializer.endTag(null,"wind");
                
                serializer.endTag(null,"city");
            }
            serializer.endTag(null,"info");
            serializer.endDocument();
        
        } catch (Exception e)
        {
            e.printStackTrace();
            Toast.makeText(this, "保存失敗",0).show();
        }
    }
pull解析xml:
//返回List>方便SimpleAdapter設置數據源
public static List> getWeatherData(File file)
    {
        if(file == null)
            return null;
        XmlPullParser parser = Xml.newPullParser();
        List> list = null;
        Map map = null;
        try
        {
            parser.setInput(new FileInputStream(file),"utf-8");
            
            int type = parser.getEventType();
            while(type != XmlPullParser.END_DOCUMENT)
            {
                switch (type)
                {
                case XmlPullParser.START_TAG:
                    if("info".equals(parser.getName()))
                    {
                        list = new ArrayList>();
                    }else if("city".equals(parser.getName()))
                    {
                        map = new HashMap();
                        map.put("city",parser.getAttributeValue(null,"name"));
                    }else if("weather".equals(parser.getName()))
                    {
                        map.put("weather",parser.nextText());
                    }else if("temp".equals(parser.getName()))
                    {
                        map.put("temp",parser.nextText());
                    }else if("wind".equals(parser.getName()))
                    {
                        map.put("wind",parser.nextText());
                    }
                    break;
                case XmlPullParser.END_TAG:
                    if("city".equals(parser.getName()))
                    {
                        list.add(map);
                        map = null;
                    }
                    break;
                    
                default:
                    break;
                }
                type = parser.next();
            }
        } catch (Exception e)
        {
            e.printStackTrace();
            Log.i(TAG,e.getMessage());
        }
        return list;
    }
待解析的xml文件(下同,天氣實體bean對象略):

    
        
        34
        東風
    
    
        雷陣雨
        24
        南風
    
    
        雨夾雪
        32
        西風
    
二、sax解析 1.需要使用的類:
一個自定義的繼承org.xml.sax.helpers.DefaultHandler的處理器類
javax.xml.parsers.SAXParserFactory工廠類
javax.xml.parsers.SAXParser類,解析器
2.是否需要擴展jar包:不需要 3.使用方式: 1.根據你要解析的xml定義一個處理器(復寫startDocument,startElement,characters,endElement方法):
 public class SaxHandler4Weather extends DefaultHandler
{
    @Override
    public void startDocument() throws SAXException
    {
    }
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException
    { 
    } 
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException
    {
        
    }
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException
    {
    }
}
2.利用解析器工廠,創建解析器對象
SAXParserFactory factory = SAXParserFactory.newInstance();        
SAXParser parser = factory.newSAXParser();
3.利用自定義的處理器解析xml
parser.parse(file,handler);
4.handler處理器對象中應該提供類似getData的方法,利用此方法將解析結果返回。
4.實例: 1.處理器
package cn.edu.chd.xmlutils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * @author Rowand jj
 *
 *解析天氣的xml處理器
 */
public class SaxHandler4Weather extends DefaultHandler
{
    private Map map = null;//存儲單個解析的完整對象
    private List> list = null;//存儲所有的解析對象
    
    private String currentTag = null;//正在解析的元素的標簽
    private String currentValue = null;//解析當前元素的值
    private String nodeName = "city";//待解析的xml文件中代表一個實體的xml根節點名
    
    @Override
    public void startDocument() throws SAXException
    {
        list = new ArrayList>();
    }
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException
    {
        if(qName.equals(nodeName))//發現city節點
        {
            map = new HashMap();
        }
        if(attributes!=null && map!= null)
        {
            for(int i = 0; i < attributes.getLength();i++)
            {
                if(attributes.getQName(i).equals("name"))
                {
                    map.put("city", attributes.getValue(i));
                }
            }
        }
        currentTag = qName;
    }
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException
    {
        if(qName.equals(nodeName))//一個city節點解析完畢
        {
            list.add(map);
            map = null;
        }
    }
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException
    {
        if(currentTag!=null && map!=null)
        {
            currentValue = new String(ch,start,length).trim();
            if(nodeName.equals(currentTag))//city節點
            {
            }else if("weather".equals(currentTag))//是否是weather節點
            {
                map.put("weather", currentValue);
            }else if("temp".equals(currentTag))//是否是temp節點
            {
                map.put("temp",currentValue);
            }else if("wind".equals(currentTag))//是否是wind節點
            {
                map.put("wind",currentValue);
            }
        }
        currentTag = null;
        currentValue = null;
    }
    public List> getList()
    {
        return list;
    }
}
2.解析xml:
public static List> getWeatherData(File file)
    {
        List> list = null;
        try
        {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser parser = factory.newSAXParser();
            SaxHandler4Weather handler = new SaxHandler4Weather();
            parser.parse(file,handler);
            list = handler.getList();
            Log.i(TAG,"-->size = "+list.size());
        } catch (Exception e)
        {
            Log.i(TAG,e.getMessage());
        }
        return list;
    }
------------------------------------------------ 下載示例代碼



  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved