新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Android中XML解析-PULL解析

        Android中XML解析-PULL解析

        作者: 時間:2016-09-12 來源:網絡 收藏

        前面寫了兩篇XML解析的Dom和SAX方式,Dom比較符合思維方式,SAX事件驅動注重效率,除了這兩種方式以外也可以使用Android內置的Pull解析器解析XML文件。 Pull解析器的運行方式與 SAX 解析器相似,也是事件觸發的。Pull解析方式讓應用程序完全控制文檔該怎么樣被解析,比如開始和結束元素事件,使用parser.next()可以進入下一個元素并觸發相應事件。通過Parser.getEventType()方法來取得事件的代碼值,解析是在開始時就完成了大部分處理。事件將作為數值代碼被發送,因此可以使用一個switch對感興趣的事件進行處理,只過PULL方式讀xml回調方法返回的是數字。

        本文引用地址:http://www.104case.com/article/201609/304413.htm

        Pull創建XML

        創建XML先實例化一個序列化對象,之后的通過Tag進行操作:

        public void createXML() {

        // 初始化一個序列化對象

        XmlSerializer serializer = Xml.newSerializer();

        File path = new File(getFilesDir(), BookTest.xml);

        try {

        FileOutputStream foStream = new FileOutputStream(path);

        serializer.setOutput(foStream, utf-8);

        //設置文檔

        serializer.startDocument(utf-8, true);

        //設置根節點

        serializer.startTag(null, Books);

        for (int i = 1; i 4; i++) {

        //設置子節點

        serializer.startTag(null, Book);

        serializer.attribute(null, name, 書籍 + i);

        serializer.startTag(null, Title);

        serializer.text(內容 + i);

        serializer.endTag(null, Title);

        serializer.endTag(null, Book);

        }

        serializer.endTag(null, Books);

        serializer.endDocument();

        } catch (FileNotFoundException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

        } catch (IllegalArgumentException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

        } catch (IllegalStateException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

        } catch (IOException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

        }

        }

        生成的XML的結果:

        Pull讀取XML

        展示內容調用getListBooksByPull方法:

        public List getListBooksByPull() {

        list = new ArrayList();

        File path = new File(getFilesDir(), BookTest.xml);

        try {

        FileInputStream inputStream = new FileInputStream(path);

        // 獲得pull解析器對象

        XmlPullParser parser = Xml.newPullParser();

        // 指定解析的文件和編碼格式

        parser.setInput(inputStream, utf-8);

        int eventType = parser.getEventType(); // 獲得事件類型

        Book book = null;

        while (eventType != XmlPullParser.END_DOCUMENT) {

        String tagNameString = parser.getName();

        switch (eventType) {

        case XmlPullParser.START_TAG:

        if (Book.equals(tagNameString)) {//Book標簽

        book = new Book();

        book.setName(parser.getAttributeValue(null, name));

        } else if (Title.equals(tagNameString)) {//Title標簽

        book.setTitle(parser.nextText());

        }

        break;

        case XmlPullParser.END_TAG:

        if (Book.equals(tagNameString)) {

        list.add(book);

        }

        break;

        default:

        break;

        }

        eventType = parser.next();//重新賦值,不然會死循環

        }

        } catch (FileNotFoundException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

        } catch (XmlPullParserException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

        } catch (IOException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

        }

        return list;

        }

        相對于Dom和SAX來說,Pull比較簡單易讀,不過簡單的總結一下常用的幾個方法:讀取到xml的聲明返回 START_DOCUMENT; 讀取到xml的結束返回 END_DOCUMENT ; 讀取到xml的開始標簽返回 START_TAG ,讀取到xml的結束標簽返回 END_TAG 讀取到xml的文本返回 TEXT .

        Activity加載時候調用:

        ListView listView = (ListView) findViewById(R.id.list_pull);

        ArrayList

        list = getListBooksByPull();

        for (Book book : list) {

        HashMap

        map.put(itemTitle, book.getName());

        map.put(itemText, book.getTitle());

        arrayList.add(map);

        }

        SimpleAdapter simpleAdapter = new SimpleAdapter(this, arrayList,

        R.layout.book, new String[] { itemTitle, itemText },

        new int[] { R.id.itemTitle, R.id.itemText });

        listView.setAdapter(simpleAdapter);


        上一頁 1 2 下一頁

        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 嵊泗县| 鄄城县| 巴青县| 越西县| 六盘水市| 平江县| 金昌市| 鸡泽县| 蒙阴县| 合川市| 淳化县| 奉新县| 西峡县| 咸宁市| 毕节市| 托克逊县| 张北县| 定西市| 南安市| 德格县| 莱阳市| 深州市| 会宁县| 垦利县| 北川| 五常市| 蒲江县| 行唐县| 应城市| 孟村| 溧水县| 岳阳县| 延长县| 玛纳斯县| 通海县| 陇西县| 盈江县| 丰台区| 淮滨县| 昆明市| 隆昌县|