【Android學習筆記】XmlResourceParser解析xml文件


最近學習Android時,須要用到解析XML文件裏的數據,能夠用XmlResourceParser來解析xml文件,正好將此記錄下來。java


XmlResourceParser裏經常使用的字段和方法

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

經常使用的字段

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()

對於一些基礎的操做,上述提供的信息就夠用了。至於每一個字段,方法都是幹嗎用的,其實也就是字面上的意思。下面先上一張圖:
ide

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代碼,佈局文件就一個按鈕控件:spa

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();
        }
    }
}

打出的日誌:
日誌


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

相關文章
相關標籤/搜索