1. 程式人生 > >Android中XML解析

Android中XML解析

 

1       Xml解析

1.1     Dom解析

1.1.1  Dom解析原理

Dom解析,是把一個xml檔案全部讀入到記憶體之中進行解析的,利用JAVA自帶的函式parse進行解析,在呼叫parse方法後,xml的解析就已經完成,而xml檔案就以節點樹的形式儲存在了Document之中。我們只需要根據自己的需要在Document之中去訪問節點,獲取文字即可。

由於Dom解析需要把文字全部讀入記憶體之中,因此會消耗大量的記憶體,但是Dom解析比較方便去訪問各節點,並且也能夠從全域性上看出整個xml父子關係以及內部結構。在Android開發過程中不推薦使用,除非xml十分小。

1.1.2  Dom具體實現方法

Dom解析是按照W3C標準所制定的,解析過程:

1、  以檔案流的方式讀取xml檔案。

inputStream = this.getClass().getClassLoader().getResourceAsStream("beauties.xml");

在此要十分注意,beauties.xml必須放在src目錄下,不能是其子目錄。

2、  定義一個文件構建工廠。

Eg:DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

3、  定義一個檔案構建器

Eg:DocumentBuilder builder = factory.newDocumentBuilder();

4、  定義一個文件用來存放解析後的文件樹。

Eg:Document document = builder.parse(inputStream);

這時對xml文件解析已經完成,現在就可以從document這個變數中提取我們所需要的節點以及節點的屬性等。

5、 Element root = document.getDocumentElement();可以獲得此節點樹的根節點,在由此根據此根節點可以一步一步訪問我們所需的節點中的Text節點。

6、 在獲得我們需要的文字內容前,需要對節點標籤名字和型別進行判斷。

getNodeName獲得標籤名字,getNodeType獲得節點確切型別,

getNodeValue返回節點內容,如果是文字節點返回文字內容,否則返回null

getTextContent返回當前節點以及其子代節點的文字字串

解析的樣例程式碼:try {

           DocumentBuilderFactory factory = DocumentBuilderFactory

                  .newInstance();

           DocumentBuilder builder = factory.newDocumentBuilder();

           Document document = builder.parse(inputStream);

           // 獲取根節點

           Element root = document.getDocumentElement();

           parse(root);

           for (Beauty b : beautyList) {

              result += b.toString();

           }

           TextView textView = (TextView) findViewById(R.id.textView);

           textView.setText(result);

       } catch (Exception e) {

           e.printStackTrace();

       }

private void parse(Element element) {

       NodeList nodelist = element.getChildNodes();

       int size = nodelist.getLength();

       for (int i = 0; i < size; i++) {

           Node element2 = (Node) nodelist.item(i);

           String tagName = element2.getNodeName();

           if (tagName.equals("beauty")

                  && element2.getNodeType() == Document.ELEMENT_NODE) {

              beauty = new Beauty();

              if (element2.getNodeType() == Document.ELEMENT_NODE) {

                  parse((Element) element2);//遞迴進行訪問

              }

              beautyList.add(beauty);

           }

           if (tagName.equals("name")) {

              String name = element2.getTextContent();

              beauty.setName(name);

           }

           if (tagName.equals("age")) {

              String age = element2.getTextContent();

              beauty.setAge(age);

           }

       }

    }

1.2     Pull解析

1.2.1  Pull解析原理

Pull解析是Android自帶的一種解析方式。使用的是事件觸發的方式,他不需要把所有xml文件都讀入進記憶體之中,而事件的型別是以整數的形式表示。在使用Pull解析時可以隨時終止解析,因此當我們找到我們所需內容後,則可以終止解析。由於Pull解析是Android自帶的一種解析方式,並且不會把所有xml檔案的內容讀入記憶體,達到了對記憶體的較低消耗,所以面對手機客戶端的應用開發,這是一種十分推崇的方式。對於效率優先的這種方式也有自己的不足,就是不能很好的瞭解xml檔案的內部結構。

1.2.2  Pull解析實現方法

1、  以檔案流的方式讀取xml檔案。

InputStream inputStream = this.getClassLoader().getResourceAsStream("person.xml");

注意:person.xml檔案也必須存在src目錄下,不能是其子目錄。

2、  獲取一個XmlPullParser

XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();

XmlPullParser parser = xmlPullParserFactory.newPullParser();

3、  設定輸入流編碼方式

parser.setInput(inputStream, "UTF-8");此處以UTF-8為例。

4、  獲取當前事件型別

int eventType = parser.getEventType();

具有的型別有:XmlPullParser.END_DOCUMENT,XmlPullParser.START_TAG,XmlPullParser.END_TAG,XmlPullParser.START_DOCUMENT等事件型別。

5、  根據其事件型別進行不同的處理,

getAttributeValue獲取屬性值,getName獲取元素節點名稱。

parser.next()觸發下一個 事件。

樣例程式碼:其中解析出的每一項都並列的顯示在列表之中。

try{

        //以流的形式獲取SRC目錄下的xml檔案(此檔案父親資料夾必須是SRC)

        InputStream inputStream = this.getClassLoader().getResourceAsStream("person.xml");

        //獲取一個XmlPullParser

        XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();

        XmlPullParser parser = xmlPullParserFactory.newPullParser();

        //設定輸入流已經編碼方式

        parser.setInput(inputStream, "UTF-8");

        //獲取當前事件型別

        int eventType = parser.getEventType();

        int i = -1;

        String[] data = new String[20];

        Person person = null;

        while(XmlPullParser.END_DOCUMENT!=eventType){

             String nodeName = parser.getName();

             switch(eventType){

             case XmlPullParser.START_TAG:

                if(nodeName.equals("s")||nodeName.equals("c")){

                    i++;

                    data[i] = parser.getAttributeValue(0)+"     "+parser.getAttributeValue(1);

                }

                break;

             case XmlPullParser.END_TAG:

                if(nodeName.equals("s")||nodeName.equals("c")&&person!=null){

                    persons.add(person);

                }

                break;

             default :

                    break;

             }

              //手動觸發下一個事件

             eventType = parser.next();

        }

        for (; i < 20; i++) {

                data[i] = "列表項" + i;

            }

        ArrayAdapter<String> arrayAdapter = new  ArrayAdapter<String>(this, R.layout.main, data);

        this.setListAdapter(arrayAdapter);

        }

        catch (Exception e) {  

        System.out.println("-------->出現異常");

                   e.printStackTrace();  

        }

1.3     Sax解析

1.3.1  Sax解析原理

順序的對文件進行掃描,當掃描到文件(Document)開始與結束、元素(Element)開始與結束等地方時通知事件處理函式,由事件處理函式做相應動作,然後繼續同樣的掃描,直至文件結束。

在解析工程中主要產生以下事件:

start document,start element,characters,end element,end document

與之相對應的有一下幾種方式:

Void startDocument()       //文件開始處理方式

Void endDocument()       //文件結束處理方式

Void startElement(String uri,String localName,String qName,Attibutes atts)   //元素開始處理方式,localName是不帶字首的名字,qName是帶字首的名字。

Void endElement(String uri,String localName,String qName)        //元素結束處理方式

Void character(char[] ch,int start int length)                    

1.3.2  Sax實現方法

1、  以檔案流的方式讀取檔案,同pull解析。

2、  寫一個類繼承DefaulterHandler,實現自己的事件處理方法。

3、  獲取一個Sax解析器

SAXParserFactory factory = SAXParserFactory.newInstance();

SAXParser parser = factory.newSAXParser();

4、  開始解析

具體程式碼實現,由於SAX解析原理和Pull解析很相似,不同在於,SAX解析器,解析過程是自動的,不能人工控制,而Pull可以主動的去獲取事件,所以Pull可以隨時在獲取了需要的條件後結束解析。所以我沒有現實Sax解析的具體程式碼。

相關推薦

AndroidXML解析

 1       Xml解析1.1     Dom解析1.1.1  Dom解析原理Dom解析,是把一個xml檔案全部讀入到記憶體之中進行解析的,利用JAVA自帶的函式parse進行解析,在呼叫parse方法後,xml的解析就已經完成,而xml檔案就以節點樹的形式儲存在了Doc

AndroidXML文件的序列化生成與解析

eval test director 南海 attribute trac cli found dir 首先,我把Person的實體類 package net.loonggg.test; public class Person { privat

Android學習記錄(1)—AndroidXML檔案的序列化生成與解析

xml檔案是非常常用的,在android中json和xml是非常常用的兩種封裝資料的形式,從伺服器中獲取資料也經常是這兩種形式的,所以學會生成和解析xml和json是非常有用的,json相對來說是比較簡單的,咱不做介紹了,這裡給大家講一下xml的序列化生成和解析。不廢話了,

java和androidsax解析xml

學習安卓sax解析xml時,想用java寫一個解析某個xml檔案的Handler,程式碼如下: import org.xml.sax.*; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parser

cocos2d-x XML解析與數據存儲

lba false 網上 unsigned failed popu new ccm cfile 一不小心就玩了一周的遊戲了。哎。玩的時候時間過得總是這麽快。。。 於是今天決定看一下之前不怎麽非常熟悉的XML;(之前做遊戲時數據的儲存用到過XML,但這塊是還有一個同事在做

AndroidXML的名稱空間、自定義屬性

基本概念介紹 名稱空間(namespace) XML 名稱空間提供避免元素命名衝突的方法。 打個比方,A學校有名學生叫做林小明,B學校也有名學生叫林小明,那我們如何識別這兩名擁有相同名字的同學呢?這時候名稱空間就派上用場了。A和B此時就可以被當成是名稱空間了。也就是說,

javaURI,URL,URL介紹及AndroidUri解析

一、URI 1.1 定義 在電腦術語中,統一資源識別符號(Uniform Resource Identifier,即URI)是一個用於標識某一網際網路資源名稱的字串。 該種標識允許使用者對任何(包括本地和網際網路)的資源通過特定的協議進行互動操作。 1.2 組成 一般格式為:

Android實現XML解析技術

本文介紹在Android平臺中實現對XML的三種解析方式。   XML在各種開發中都廣泛應用,Android也不例外。作為承載資料的一個重要角色,如何讀寫XML成為Android開發中一項重要的技能。   在Android中,常見的XML解析器分別為DOM解析器、SAX

Androidxml佈局檔案使用include引入佈局進行復用(解決使用include佈局重疊,顏色設定無效問題)

使用include引入佈局的作用   提取重複的佈局程式碼,方便進行復用 如何使用   比如我們想要線上性佈局中建立三塊需要複用的佈局headview、centerview、butto

Pythonxml解析

XML指可擴充套件標記語言(extensibleMarkup Language),被設計用來傳輸和儲存資料python有3種方法解析XML:SAX,DOM以及ElemenTree1、SAX(simple API for XML)python標準庫包含SAX解析器,SAX用事件

android XML和物件轉換利器Xstream的使用

    //JettisonMappedXmlDriver 轉換的字串 {"list":{"student":[{"id":1,"name":"haha","email":"email","address":"address","birthday":[{},"2010-11-22"]}]},"student"

Androidxml實現效果二:邊框效果

邊框效果是通過定義一個背景為xml檔案來實現的;     #1 menu_border.xml 白色邊框效果,可修改color的值來改變邊框顏色;  <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http:/

Android APK XML解析與反編譯方法

APK中的XML為何不能直接開啟,是否只是簡單的二進位制檔案,難道被加密了?為什麼AXMLPrinter2反編譯的時候竟然報錯了,如何解決? java.lang.ArrayIndexOutOfBoundsException: 128 at android.c

androidxml tools屬性詳解

第一部分 安卓開發中,在寫佈局程式碼的時候,ide可以看到佈局的預覽效果。 但是有些效果則必須在執行之後才能看見,比如這種情況:TextView在xml中沒有設定任何字元,而是在activity中設定了text。因此為了在ide中預覽效果,

androidjson解析及使用 (下)

android中 edi token ims stream 一個 ace follow ipp 接上文 七、通過JSONTokener來解析json文本 7.1、將json文本解析為對象 我們可以通過JSONTokener的nextValue()來獲得JSON

Android三種常用解析XML的方式(DOM、SAX、PULL)簡介及區別

字符串 lan win name屬性 Coding 空間 toc log fin XML在各種開發中都廣泛應用,Android也不例外。作為承載數據的一個重要角色,如何讀寫XML成為Android開發中一項重要的技能。今天就由我向大家介紹一下在Android平臺下幾種常見的

android常用的xml生成與解析

總結了一下解析XML的三種方式。下圖為要解析的XML的格式。 解析了兩種方式的XML,一種是檔案,另一種是流。 程式碼中用到的許多的類是我虛構出來的,例如在第二種解析中用到的User類。使用者應該先寫這個類,寫出他們的屬性,並寫get和set方法才可以的。 <?xml

Android使用pull解析xml檔案

Android解析xml檔案的時候,自己推薦是使用pull的方式來解析xml資原始檔,pull方式又有兩種,分別是XmlPullParser和XmlResourceParser兩種。下面來分別介紹。 一: XmlPullParser方式進行佈局解析。

Android 使用Pull解析XML檔案

解析XML檔案是非常常用的功能,在Android客戶端中,經常與伺服器通訊都需要xml檔案的支援,我們這裡介紹一個 簡單的xml檔案的解析,就是使用android中的pull方法進行解析。在java中,有dom解析和sax解析,這個pull解析有些類 似於sax解析,他也是

Android幾種xml解析的比較

Andorid中xml解析方法有以下三種:DOM解析、SAX解析、還有Pull解析。今天我們就來比較一下幾種解析方法的優缺點 DOM 解析 優點: 1.XML 樹在記憶體中完整儲存,因此可以直接修改其資料和結構. 2.可以通過該解析器隨時訪問XML 樹中的任何一個節點. 3