• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 【Android學習筆記】XmlResourceParser解析xml文件


    最近學習Android時,需要用到解析XML文件里的數據,可以用XmlResourceParser來解析xml文件,正好將此記錄下來。


    XmlResourceParser里常用的字段和方法

    首先先給出源碼里面一些比較基礎的,常用的方法和字段。

    常用的字段

    int START_DOCUMENT = 0;  
    int END_DOCUMENT = 1;  
    int START_TAG = 2;  
    int END_TAG = 3;  
    int TEXT = 4;  

    getEventType()

    /**
     * Returns the type of the current event (START_TAG, END_TAG, TEXT, etc.)
     * 大意就是返回當前的事件類型(返回的字段都是xml文件中某些特定位置,比如標簽開始標志,標簽結束標志,文檔結束標志等)
     *
     */  
       
    int getEventType();

    getName()

    /**
     * For START_TAG or END_TAG events, the (local) name of the current
     * element is returned when namespaces are enabled. When namespace
     * processing is disabled, the raw name is returned.
     * 大意就是對于 START_TAG,END_TAG,這兩種事件,有無使用命名空間情況下返回的標簽名。至于命名空間的詳情,可以去參考xml的具體介紹(囧:我也不懂)
     *
     */     
    String getName();
     

    getText()

    /**
     * Returns the text content of the current event as String.
     * 返回text內容
     *
     */   
    String getText();
     

    getAttributeName(int index)

     /**
     * Returns the local name of the specified attribute
     * if namespaces are enabled or just attribute name if namespaces are disabled.
     * 大意就是返回指定位置的屬性名,位置從0開始
     *
     * @param index zero-based index of attribute
     * @return attribute name (null is never returned)
     */
    String getAttributeName(int index);

    getAttributeValue(int index)

    /**
     * Returns the given attributes value.
     * 大意就是返回指定位置的屬性值,位置從0開始
     *
     * @param index zero-based index of attribute
     * @return value of attribute (null is never returned)
     */   
    String getAttributeValue(int index);

    getAttributeValue(String namespace,String name)

    /**
     * Returns the attributes value identified by namespace URI and namespace localName.
     * If namespaces are disabled namespace must be null.
     * 大意就是返回指定的屬性名對應的屬性值,如果沒有使用命名空間,則第一個參數傳入null
     *
     * @param namespace Namespace of the attribute if namespaces are enabled otherwise must be null
     * @param name If namespaces enabled local name of attribute otherwise just attribute name
     * @return value of attribute or null if attribute with given name does not exist
     */   
    String getAttributeValue(String namespace,String name);

    next()

    /**
     * Get next parsing event - element content will be coalesced and only one
     * TEXT event must be returned for whole element content
     * 大意就是獲取下一個要解析的事件,通俗點說就是類似于將光標往下移
     */   
    int next()  

    對于一些基礎的操作,上述提供的信息就夠用了。至于每個字段,方法都是干嘛用的,其實也就是字面上的意思。下面先上一張圖:
    810210-20160501180825738-1085577796.jpg

    XmlResourceParser具體如何解析xml不清楚,但解析過程有點類似于sqlite cursor遍歷。首先都是初始定位在文檔開始處,通過調用 next() 來將光標往下移,通過 getEventType() 來獲取當前光標停留在哪里,然后再通過對應的 get××××() 方法來獲取我們想要的數據。

    實例

    首先在res/目錄下建一個xml文件夾,然后新建一個xml文件命名為xml.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <xml>
    <Node att1="hello" att2="world"/>
        HelloWorld!
    </xml>  

    然后是java代碼,布局文件就一個按鈕控件:

    public class MainActivity extends AppCompatActivity {
        private static final String TAG = "MainActivity";
        private Button btn1;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            btn1 = (Button) findViewById(R.id.btn1);
            btn1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    logXmlData();
                }
            });
        }
    
        public void logXmlData() {
            XmlResourceParser xmlParser = getResources().getXml(R.xml.xml);
    
            try {
                int event = xmlParser.getEventType();   //先獲取當前解析器光標在哪
                while (event != XmlPullParser.END_DOCUMENT){    //如果還沒到文檔的結束標志,那么就繼續往下處理
                    switch (event){
                        case XmlPullParser.START_DOCUMENT:
                            Log.i(TAG,"xml解析開始");
                            break;
                        case XmlPullParser.START_TAG:
                            //一般都是獲取標簽的屬性值,所以在這里數據你需要的數據
                            Log.d(TAG,"當前標簽是:"+xmlParser.getName());
                            if (xmlParser.getName().equals("Node")){
                                //兩種方法獲取屬性值
                                Log.d(TAG,"第一個屬性:" + xmlParser.getAttributeName(0)
                                        + ": " + xmlParser.getAttributeValue(0));
                                Log.d(TAG,"第二個屬性:" + xmlParser.getAttributeName(1)+": "
                                        + xmlParser.getAttributeValue(null,"att2"));
                            }
                            break;
                        case XmlPullParser.TEXT:
                            Log.d(TAG,"Text:" + xmlParser.getText());
                            break;
                        case XmlPullParser.END_TAG:
                            break;
                        default:
                            break;
                    }
                    event = xmlParser.next();   //將當前解析器光標往下一步移
                }
            } catch (XmlPullParserException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }  

    打出的日志:
    810210-20160501190720675-1264227043.jpg


    QQ圖片20180316094923.jpg
    最近剛開通了公眾號,想激勵自己堅持寫作下去,初期主要分享原創的Android或Android-Tv方面的小知識,感興趣的可以點一波關注,謝謝支持~~

    版權聲明:本文為weixin_30553065原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/weixin_30553065/article/details/94923525

    智能推薦

    Android學習筆記(16)————Android的XML解析之pull方式

    /******************************************************************************************** * author:conowen@大鐘 * E-mail:[email protected] * http://blog.csdn.net/conowen * 注:本文為原創,僅作為學習交流使用,轉載請標明作...

    Android知識點 800 —— XML文件解析,SAX解析

    SAX的全稱是Simple APIs for XML,也即XML簡單應用程序接口。與DOM不同,SAX提供的訪問模式是一種順序模式,這是一種快速讀寫XML數據的方式。當使用SAX分析器對XML文檔進行分析時,會觸發一系列事件,并**相應的事件處理函數,應用程序通過這些事件處理函數實現對XML文檔的訪問,因而SAX接口也被稱作事件驅動接口。 優點: 1、采用事件驅動模式,按節點,一邊讀一邊解析。對內...

    android學習筆記----pull解析與xml生成和應用申請權限模版

    先來個pull解析測試,然后是pull解析用法說明,文章末尾附有xml生成方式。 學習目標:首先是解析測試例子給出的對于常用字段的理解,然后是pull解析常用套路方法,最后是xml的2種生成方式。 經常寫代碼需要申請動態權限,在最后例子也順帶記錄下來,方便查閱。 目錄 pull解析測試: pull解析例子: xml生成方式(代碼添加申請權限示范模版):   pull解析例子的源碼:htt...

    Android學習筆記整理(12)--XML解析及天氣預報案例

    1.XML解析 若想要操作XML文檔,首先需要將XML文檔解析出來。通常情況下,解析XML文件有三種方式 DOM解析 DOM(Document Object Mode)解析是一種基于對象的API,它會將XML文件的所有內容以文檔樹方式存放在內存中,然后允許使用DOM API遍歷XML樹、檢索所需的數據,這樣便能根據樹的結構以節點的形式來 DOM操作XML代碼看起來是比較直觀,編碼比SAX解析簡單,...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    猜你喜歡

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    精品国产乱码久久久久久蜜桃不卡