pull解析xml檔案
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 這就定義命名空間的
給屬性添加命名空間後 就表示是那個命名空間的屬性 類似包名 不過不常用
Android 使用pull,sax解析xml
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