編輯:關於android開發
1.獲得XmlpullParser類的引用
這裡有兩種方法
//解析器工廠 XmlPullParserFactory factory=XmlPullParserFactory.newInstance(); XmlPullParser pullParser=factory.newPullParser();
//直接獲得實例
XmlPullParser pullParser= Xml.newPullParser();
2.設置解析內容
通過setInput方法設置解析內容 重載寫的很清楚 把xml文件讀取到Reader 或 InputStream中 注意 InputStream需要指定編碼
pullParser.setInput(getAssets().open("student.xml"),"utf-8");
getAssets().open("student.xml")返回一個字節流InputStream 所以需要指定編碼格式
3.獲取當前的事件類型 開始解析
START_DOCUMENT 開始讀取文檔
END_DOCUMENT 結束讀取文檔
START_TAG 開始讀取標簽
END_TAG 結束讀取標簽
xml數據
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <persons> 3 <person id="1"> 4 <name>張三</name> 5 <age>23</age> 6 </person> 7 <person id="2"> 8 <name>李四</name> 9 <age>23</age> 10 </person> 11 </persons>
pull解析核心代碼
1 try { 2 //解析器工廠 3 XmlPullParserFactory factory=XmlPullParserFactory.newInstance(); 4 //創建解析器 5 XmlPullParser pullParser=factory.newPullParser(); 6 //直接創建解析器 7 //pullParser= Xml.newPullParser(); 8 //設置解析內容 9 //getAssets().open("student.xml")返回一個字節流InputStream 所以需要指定編碼格式 10 pullParser.setInput(getAssets().open("student.xml"),"utf-8"); 11 //開始解析 12 //獲取當前解析的標簽 13 //獲取當前事件類型:開始讀取文檔,開始讀取標簽,結束標簽,結束讀取文檔 類似一個狀態 14 int type=pullParser.getEventType(); 15 while (type!=XmlPullParser.END_DOCUMENT){ 16 switch (type){ 17 //開始讀取文檔 18 case XmlPullParser.START_DOCUMENT: 19 break; 20 //開始讀取標簽 21 case XmlPullParser.START_TAG: 22 String tag=pullParser.getName();//獲取節點名 23 if(tag.equals("person")){ 24 person=new Person(); 25 //獲取節點屬性 26 String id=pullParser.getAttributeValue("","id"); 27 if (TextUtils.isEmpty(id)) continue; 28 person.setId(Integer.parseInt(id)); 29 }else if(tag.equals("name")){ 30 //獲取下一個文本 31 String name=pullParser.nextText(); 32 if (TextUtils.isEmpty(name)) continue; 33 person.setName(name); 34 }else if(tag.equals("age")){ 35 String age=pullParser.nextText(); 36 if (TextUtils.isEmpty(age)) continue; 37 person.setAge(Integer.parseInt(age)); 38 } 39 break; 40 //結束讀取標簽 41 case XmlPullParser.END_TAG: 42 tag=pullParser.getName(); 43 //當一個person 讀取完成之後 添加到list 44 if(tag.equals("person")){ 45 persons.add(person); 46 } 47 break; 48 //結束讀取文檔 49 case XmlPullParser.END_DOCUMENT: 50 break; 51 } 52 //讀取下一個事件 53 type=pullParser.next(); 54 } 55 } catch (XmlPullParserException e) { 56 e.printStackTrace(); 57 } catch (IOException e) { 58 e.printStackTrace(); 59 }
這裡提一下getAttributeValue()方法 獲取節點屬性 有兩個參第一個參數代表的是命名空間 什麼xml是裡的命名空間呢 一般xml文件根元素附加都會有xmlns 這就定義命名空間的
給屬性添加命名空間後 就表示是那個命名空間的屬性 類似包名 不過不常用
SAX解析xml數據
sax對文檔進行順序掃描 當掃描到文檔開始結束,元素開始結束,標簽開始結束都會觸發事件
sax的使用和pull差不多 個人喜歡用sax多一點,sax采用的事件驅動
sax是通過重寫方法來實現,符合條件就會觸發回調 這些方法都是定義在ContentHandler接口中,Android為我們提供了一個幫助類DefaultHandler,只需要繼承這個類,重寫方法就ok
核心代碼
1 try { 2 //創建SAX解析器 3 SAXParserFactory factory=SAXParserFactory.newInstance(); 4 SAXParser parser= factory.newSAXParser(); 5 //自定一個Handler解析器 6 PersonHandler handler=new PersonHandler(); 7 //解析器對xml進行解析 8 parser.parse(getAssets().open("student.xml"),handler); 9 for(Person p:handler.getPersonList()){ 10 Log.e("XmlSAXParser",p.getName()+"====="+p.getAge()+"=========="+p.getId()); 11 } 12 } catch (ParserConfigurationException e) { 13 e.printStackTrace(); 14 } catch (SAXException e) { 15 e.printStackTrace(); 16 } catch (IOException e) { 17 e.printStackTrace(); 18 }
解析器代碼
1 public class PersonHandler extends DefaultHandler { 2 //保存數據 3 private List<Person> personList; 4 private Person person; 5 //節點名稱 當前解析的元素名 6 private String tag; 7 8 /** 9 * 處理xml文件中讀到到文本內容 10 * @param ch 字符串內容 11 * @param start 起始位置 12 * @param length 長度 13 * @throws SAXException 14 */ 15 @Override 16 public void characters(char[] ch, int start, int length) throws SAXException { 17 super.characters(ch, start, length); 18 //創建成字符串 19 String text=new String(ch,start,length).trim(); 20 //字符串不能為空,既不讀取空的文本節點,如換行 21 if(TextUtils.isEmpty(text)) return; 22 //當節點名稱等於name時賦值 23 if("name".equals(tag)){ 24 person.setName(text); 25 }else if("age".equals(tag)){ 26 person.setAge(Integer.parseInt(text)); 27 } 28 } 29 30 /** 31 * 32 * @param uri 命名空間 沒啥用 33 * @param localName 前綴標簽名 沒啥用 34 * @param qName 節點名字 35 * @param attributes 屬性集合 36 * @throws SAXException 37 */ 38 @Override//qName attributes 39 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 40 super.startElement(uri, localName, qName, attributes); 41 tag=qName; 42 //為什麼創建集合 和對象 請看上面的xml 仔細分析 43 if("persons".equals(qName)){ 44 //數據存儲的集合 45 personList=new ArrayList<>(); 46 }else if("person".equals(qName)){ 47 person=new Person(); 48 String id=attributes.getValue("id"); 49 if (!TextUtils.isEmpty(id)){ 50 person.setId(Integer.parseInt(id)); 51 } 52 } 53 } 54 55 @Override 56 public void endElement(String uri, String localName, String qName) throws SAXException { 57 super.endElement(uri, localName, qName); 58 if("person".equals(qName)){ 59 personList.add(person); 60 } 61 } 62 63 }
還有startElement startDocument endDocument等方法
過幾天會整理一個xml和listview的簡單使用的Demo
使用Kotlin開發Android應用 1、Kotlin介紹 [Kotlin](https://kotlinlang.org/) Kotlin是一門基於JVM的
在Linux上分析死鎖問題的簡單方法死鎖 (deallocks): 是指兩個或兩個以上的進程(線程)在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們
Android通過achartengine畫折線圖,achartengine折線圖因為前段時間Android項目中用到了折線圖的功能,在查資料的過程中發現acharten
Android Studio中JNI程序的單步調試和日志打印,androidjni近日有個算法(檢測碰撞)需要用C++實現,目的是IOS和ANDROID中共享同一段程序。