[安卓筆記]安卓下xml檔案的解析

來源:互聯網
上載者:User

安卓下解析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.Xmlorg.xmlpull.v1.XmlSerializerorg.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;    }
------------------------------------------------ 下載範例程式碼



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.