編輯:Android編程入門
在網絡上傳輸數據時最常用的格式有兩種,XML和JSON,下面首先學一下如何解析XML格式的數據。解析XML 格式的數據其實也有挺多種方式的,本節中我們學習比較常用的兩種,Pull解析和SAX 解析。
目錄導航
一、一般我們常用的五個事件:
二、pull解析的步驟:
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
xpp.setInput ( new FileReader (filename ) );
<?xml version="1.0" encoding="utf-8"?> <LOL> <person> <!-- 這裡是蓋倫的注釋 --> <name sex="man">蓋倫</name> <address>德瑪西亞</address> <say>我將帶頭沖鋒</say> </person> <person> <!-- 這裡是亞索的注釋 --> <name sex="man">亞索</name> <address>艾歐尼亞</address> <say>死亡如風,常伴吾身</say> </person> <person> <!-- 這裡是瑞雯的注釋 --> <name sex="girl">瑞雯</name> <address>諾克薩斯</address> <say>戰爭與謀殺之間,潛藏著我們的心魇</say> </person> </LOL>
// 得到xml的數據 private String getXMLData(String fileName) { StringBuffer stringBuffer = new StringBuffer(); InputStream inputStream = null; BufferedReader bufferedReader = null; try { inputStream = getResources().getAssets().open(fileName); bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line = ""; while ((line = bufferedReader.readLine()) != null) { stringBuffer.append(line + "\n"); } bufferedReader.close(); inputStream.close(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (bufferedReader != null) { bufferedReader.close(); } if (inputStream != null) { inputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } Log.i(TAG, stringBuffer.toString()); return stringBuffer.toString(); }
// pull解析xml數據 public void pullParse(View view) { String xmlData = getXMLData(fileName); try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser xmlPullParser = factory.newPullParser(); xmlPullParser.setInput(new StringReader(xmlData)); int eventType = xmlPullParser.getEventType(); String name = ""; String address = ""; String say = ""; String sex = ""; while (eventType != XmlPullParser.END_DOCUMENT) { String nodeName = xmlPullParser.getName(); switch (eventType) { case XmlPullParser.START_TAG: { if ("name".equals(nodeName)) { // sex與name的位置不能互換 // sex = xmlPullParser.getAttributeValue(0); sex = xmlPullParser.getAttributeValue(null, "sex"); name = xmlPullParser.nextText(); } else if ("address".equals(nodeName)) { address = xmlPullParser.nextText(); } else if ("say".equals(nodeName)) { say = xmlPullParser.nextText(); } break; } // 完成解析某個結點 case XmlPullParser.END_TAG: { if ("person".equals(nodeName)) { Log.d(TAG, "name: " + name); Log.d(TAG, "address: " + address); Log.d(TAG, "say: " + say); Log.d(TAG, "sex: " + sex); } break; } default: break; } eventType = xmlPullParser.next(); } } catch (Exception e) { e.printStackTrace(); } }
一、 sax解析的簡要:
SAX:事件驅動型的XML解析方式。順序讀取XML文件,不需要一次全部裝載整個文件。當遇到像文件開頭,文檔結束,或者標簽開頭與標簽結束時,會觸發一個事件,用戶通過在其回調事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問,且是只讀的。由於移動設備的內存資源有限,SAX的順序讀取方式更適合移動開發。
二、 SAX解析XML步驟:
三、SAX解析的過程:
package com.example.linux.xmlparsetest; import android.util.Log; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * Created by Linux on 2016/3/16. */ public class ContentHandler extends DefaultHandler { private final static String TAG = "MainActivity"; private String nodeName; private StringBuilder name; private StringBuilder address; private StringBuilder say; private StringBuilder coment; private StringBuilder sex; // 文檔開始時執行 @Override public void startDocument() throws SAXException { name = new StringBuilder(); address = new StringBuilder(); say = new StringBuilder(); sex = new StringBuilder(); coment = new StringBuilder(); } // 元素開始時執行 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // 記錄當前結點名 nodeName = localName; if (nodeName.equals("name") && attributes != null) { sex.append(attributes.getValue("sex")); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { // 根據當前的結點名判斷將內容添加到哪一個StringBuilder對象中 if ("name".equals(nodeName)) { name.append(ch, start, length); } else if ("address".equals(nodeName)) { address.append(ch, start, length); } else if ("say".equals(nodeName)) { say.append(ch, start, length); } } // 元素結束時執行 @Override public void endElement(String uri, String localName, String qName) throws SAXException { if ("person".equals(localName)) { Log.d(TAG, "name is " + name.toString().trim()); Log.d(TAG, "adress is " + address.toString().trim()); Log.d(TAG, "say is " + say.toString().trim()); Log.d(TAG, "sex is " + sex.toString().trim()); // 最後要將StringBuilder清空掉 name.setLength(0); address.setLength(0); say.setLength(0); sex.setLength(0); } } // 文檔結束時 @Override public void endDocument() throws SAXException { super.endDocument(); } }
// sax解析數據 public void saxParse(View view) { String xmlData = getXMLData(fileName); try { SAXParserFactory factory = SAXParserFactory.newInstance(); XMLReader xmlReader = factory.newSAXParser().getXMLReader(); ContentHandler handler = new ContentHandler(); // 將ContentHandler的實例設置到XMLReader中 xmlReader.setContentHandler(handler); // 開始執行解析 xmlReader.parse(new InputSource(new StringReader(xmlData))); } catch (Exception e) { e.printStackTrace(); } }
區別:
相似性:
Pull解析器也提供了類似SAX的事件,開始文檔START_DOCUMENT和結束文檔END_DOCUMENT,開始元素START_TAG和結束元素END_TAG,遇到元素內容TEXT等,但需要調用next() 方法提取它們(主動提取事件)。
使用:
如果在一個XML文檔中我們只需要前面一部分數據,但是使用SAX方式或DOM方式會對整個文檔進行解析,盡管XML文檔中後面的大部分數據我們其實都不需要解析,因此這樣實際上就浪費了處理資源。使用PULL方式正合適。
源碼下載 訪問密碼 2c66
放假之後電腦配置升級就開始用Android Studio(下面簡稱AS)了,那個酸爽真的不是一般的啊,這裡開一篇博客來記錄下AS裡面各種酷炫的功能,有更好玩的,大家不要吝
在AndroidManifest.xml文件中有<application android:theme=@style/AppTheme>,其中的@style/A
Android項目的目錄結構: 資源文件夾:清單配置文件:Android的四大組件在使用前全部需要在清單文件中配置<?xml version
一、安裝android-studiohttps://github.com/inferjay/AndroidDevToolsbundle版集成環境win7jdk(JAVA環