編輯:關於Android編程
我們在開發Android應用的過程中難免會與網絡請求接觸,網路請求獲得的數據一般都是有一定的格式或者約定的形式來返回,這時候我們就需要對返回的數據進行解析,然後從中提取出我們需要呈現在界面上的數據,一般我們遇到的最常見的兩種便於網絡傳輸的數據類型便是xml和json,下面就詳細介紹一下有關他們的解析方式。
首先我們先定義一段xml數據。
1 1.0 2 Android 2.0 3 Play 3.0
方式一、Pull解析xml數據
1、獲得XmlPullParserFactory實例
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
2、 獲得XmlPullParser實例
XmlPullParser xmlPullParser = factory.newPullParser();
3、設置需要解析的數據
xmlPullParser.setInput(new StringReader(xmlData));
4、獲得當前的解析事件
int eventType = xmlPullParser.getEventType();
5、解析結點,知道xml數據解析完成
下面是一個簡單的小例子來解析最上面給出的xml數據
/** * 使用Pull解析xml數據 */ private void parseXmlDataWithPull(String xmlData) { try { //獲得XmlPullParserFactory實例 XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); //獲得XmlPullParser實例 XmlPullParser xmlPullParser = factory.newPullParser(); //將需要解析的數據設置進去 xmlPullParser.setInput(new StringReader(xmlData)); //獲得當前的解析事件 int eventType = xmlPullParser.getEventType(); String id = ""; String name = ""; String version = ""; //判斷解析工作是否完成 while (eventType != XmlPullParser.END_DOCUMENT){ String nodeName = xmlPullParser.getName(); switch (eventType){ //開始解析某個結點 case XmlPullParser.START_TAG: if ("id".equals(nodeName)){ id = xmlPullParser.nextText(); }else if ("name".equals(nodeName)){ name = xmlPullParser.nextText(); }else if ("version".equals(nodeName)){ version = xmlPullParser.nextText(); } break; //完成解析某個結點 case XmlPullParser.END_TAG: if ("app".equals(nodeName)){ Log.d("xiao", "id " + id); Log.d("xiao", "name " + name); Log.d("xiao", "version " + version); } break; default: break; } //獲取下一個解析事件 eventType = xmlPullParser.next(); } } catch (XmlPullParserException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
方式二、SAX解析xml數據
SAX解析雖然比Pull解析復雜一點,但在語義理解方面更加清楚,下面是它的具體用法。
1、創建一個類繼承自DefaultHandler,並重寫其中的5個方法。
public class MyHandler extends DefaultHandler { private String nodeName; private StringBuilder id; private StringBuilder name; private StringBuilder version; //在開始進行xml解析的時候調用 @Override public void startDocument() throws SAXException { id = new StringBuilder(); name = new StringBuilder(); version = new StringBuilder(); } //開始解析某個結點的時候調用 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { //記錄當前的結點名 nodeName = localName; } //在獲取結點中內容的時候調用 @Override public void characters(char[] ch, int start, int length) throws SAXException { //根據當前的結點名判斷將內容添加到哪一個StringBuilder對象中 if ("id".equals(nodeName)){ id.append(ch, start, length); }else if ("name".equals(nodeName)){ name.append(ch, start, length); }else if ("version".equals(nodeName)){ version.append(ch, start, length); } } //某個結點解析完成的時候調用 @Override public void endElement(String uri, String localName, String qName) throws SAXException { if ("app".equals(localName)){ //去掉可能包含的回車符和換行符 Log.d("GGGG", "id " + id.toString().trim()); Log.d("GGGG", "name " + name.toString().trim()); Log.d("GGGG", "version " + version.toString().trim()); //清空StringBuilder id.setLength(0); name.setLength(0); version.setLength(0); } } //完成整個xml解析的時候調用 @Override public void endDocument() throws SAXException { super.endDocument(); } }
2、獲得SAXParserFactory的實例
SAXParserFactory factory = SAXParserFactory.newInstance();
3、獲得XMLReader的實例
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
4、獲得我們自己定義的處理類的實例
MyHandler handler = new MyHandler();
5、將MyHandler類的實例設置到XMLReader中
xmlReader.setContentHandler(handler);
6、開始解析
xmlReader.parse(new InputSource(new StringReader(xmlData)));
下面給出完整的代碼,解析最上面給出的xml文件
/** * 用Sax解析xml數據 * @param xmlData */ private void parseXmlDataWithSax(String xmlData){ //獲得SAXParserFactory的實例 SAXParserFactory factory = SAXParserFactory.newInstance(); try { //獲得XMLReader的實例 XMLReader xmlReader = factory.newSAXParser().getXMLReader(); //獲得我們自己定義的處理類的實例 MyHandler handler = new MyHandler(); //將MyHandler類的實例設置到XMLReader中 xmlReader.setContentHandler(handler); //開始解析 xmlReader.parse(new InputSource(new StringReader(xmlData))); } catch (SAXException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
方式三、Dom解析xml數據
Dom解析也是xml常用的一種解析方式,但由於它在解析時是將整個文檔樹全部加載到內存中,所以它一般只用來解析文檔規模較小的場景,下面是一段簡單的代碼來解析文檔最開頭給出的那段xml文檔。
/** * 使用Dom解析xml * * @param xmlData */ private void parseXmlWithDom(String xmlData) { //得到DOM解析器的工廠實例 DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); //從DOM工廠中獲得DOM解析器 DocumentBuilder dbBuilder = null; try { dbBuilder = dbFactory.newDocumentBuilder(); //把要解析的xml文檔讀入DOM解析器 Document doc = dbBuilder.parse(new InputSource(new StringReader(xmlData))); //得到文檔名稱為app的元素的節點列表 NodeList nList = doc.getElementsByTagName("app"); //遍歷該集合,顯示集合中的元素及其子元素的名字 for(int i = 0; i< nList.getLength() ; i ++){ //Node轉型WieElement Element node = (Element)nList.item(i); Log.d("MMMM", "id: "+ node.getElementsByTagName("id").item(0).getFirstChild().getNodeValue()); Log.d("MMMM", "name: "+ node.getElementsByTagName("name").item(0).getFirstChild().getNodeValue()); Log.d("MMMM", "version: "+ node.getElementsByTagName("version").item(0).getFirstChild().getNodeValue()); } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
為View添加自定義XML屬性Android中的各種Widget都提供了很多XML屬性,我們可以利用這些XML屬性在layout文件中為Widget的屬性賦值。如下所示:
前幾天做的一個仿To圈個人資料界面的實現效果下面是To圈的效果Gif圖:做這個東西其實也花了一下午的時間,一開始思路一直沒理清楚,就開始盲目的去做,結果反而事倍功半。以後
1、首先解決【設置】界面默認顯示【開發者選項】的問題查看源代碼:packages/apps/Settings/src/com/android/settings
先上圖: 把這些表示觀點的view放在一個LinearLayout裡: 每個Item可以這樣來實現: &n