Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android 使用pull,sax解析xml,androidpull

Android 使用pull,sax解析xml,androidpull

編輯:關於android開發

Android 使用pull,sax解析xml,androidpull


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 這就定義命名空間的

給屬性添加命名空間後  就表示是那個命名空間的屬性 類似包名  不過不常用 

 



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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved