標籤:android 解析xml檔案
由於剛學Android,用的開發工具是Android studio,沒用過eclipse的那個開發Android,所以針對有些說由於2個IDE的路徑不通導致的檔案讀取不到,不做分析(實際上是沒法分析eclipse裡的),這個博文只針對AS使用者。
我們的資源檔,除了放到res目錄下之外,還可以放在跟java 、res同級的asserts(建立的)目錄裡。
650) this.width=650;" src="https://s3.51cto.com/wyfs02/M01/99/10/wKiom1lDfiCTkpzdAAAlgKMixsk107.png-wh_500x0-wm_3-wmp_4-s_2846464278.png" title="QQ圖片20170616144452.png" alt="wKiom1lDfiCTkpzdAAAlgKMixsk107.png-wh_50" />
今天要解析的這個xml就是在這個目錄下的。
首先說一下xmlpullparser,這個pull解析是基於事件的模式。比如
讀取到xml的開始聲明內容,那麼就會觸發START_DOCUMENT,返回一個int類型資料;
讀取到xml的結束內容,那麼觸發END_DOCUMENT,返回一個int類型資料
讀取到xml的開始標籤,返回START_TAG,
讀取到xml的結束標籤,返回END_TAG,
讀取到xml的文本返回TEXT
讀取標籤後,可以擷取該標籤的屬性值與文本值
下面這個例子講解的xml在附件中的getWeatherByCityName.xml.
下面開始講步驟:
1、擷取assets裡面的資源檔的輸入資料流。 這裡在AS中可以通過AssetManager來擷取,即第一行代碼的方式。也可以通過第二行的方式擷取這個輸入資料流
2、聲明xmlPullParser並給輸入資料流指明編碼方式。
3、定義一個xmlpullParser擷取到的事件類型,eventType。
4、開始迴圈解析,如果沒有碰到END_DOCUMENT,那麼就一直往下走;取出節點是string的tag裡的常值內容並放入到list裡,作為後面處理。
5、一定要注意,要加上eventType=xmlPullParser.next();不然的話迴圈會一直讀取xml的第一個節點,即START_DOCUMENT而不往下執行,導致死迴圈。
InputStream inputStream = getAssets().open("getWeatherbyCityName.xml");// InputStream inputStream = getClass().getClassLoader().getResourceAsStream("assets/"+"getWeatherbyCityName.xml"); XmlPullParser xmlPullParser = Xml.newPullParser(); xmlPullParser.setInput(inputStream,"utf-8"); List<String> infosList=new ArrayList<String>(); int eventType=xmlPullParser.getEventType(); while(eventType!=XmlPullParser.END_DOCUMENT){ if ("string".equals(xmlPullParser.getName())){ String info=xmlPullParser.nextText(); infosList.add(info); } eventType=xmlPullParser.next(); }
下面講一個比較常見的xml格式的檔案讀取裡面的內容:
這個xml對應的xml是附件中的info2.xml
需要注意的是xml檔案的格式正確。之前由於從網上拷貝了一個xml常值內容,結果xml莫名的各種紅線,調試下面的程式時,報xml格式錯誤,就手寫了一個xml,編譯器不報錯了,才調試好。
裡面講解的StudentBean 只是一個簡單的有3個私人屬性的類,id,name,age,帶上get/set方法
package com.yuanlp.pulldemo2;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Xml;import com.yuanlp.pulldemo2.bean.StudentBean;import org.xmlpull.v1.XmlPullParser;import java.io.InputStream;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); List<StudentBean> list=click(); for(StudentBean student : list){ System.out.println("+++++++++<><>>>>>>>>>>>id是>>>>>>>>>>>>>>>>>>>>>>>>"+student.getId()); System.out.println("+++++++++<><>>>>>>>>>>>年齡是>>>>>>>>>>>>>>>>>>>>>>>>"+student.getAge()); System.out.println("+++++++++<><>>>>>>>>>>>名字是>>>>>>>>>>>>>>>>>>>>>>>>"+student.getName()); } } public List<StudentBean> click(){ try { InputStream inputStream=getAssets().open("info2.xml"); XmlPullParser xmlPullParser= Xml.newPullParser(); xmlPullParser.setInput(inputStream,"utf-8"); StudentBean student=null; List<StudentBean> studentlist=null; int eventType=xmlPullParser.getEventType(); while(eventType!=XmlPullParser.END_DOCUMENT){ switch (eventType){ case XmlPullParser.START_DOCUMENT: studentlist=new ArrayList<StudentBean>(); break; case XmlPullParser.START_TAG: //從這個start節點到下一個end節點,讀取到的屬性都屬於一個student,所以在此聲明一個student,並將這個節點取到的資料放入到這個student中 //通過getName()判斷讀到哪裡,然後通過nextText()擷取值,或者通過getAttributeValue擷取屬性值 String tagName=xmlPullParser.getName(); if (tagName.equalsIgnoreCase("person")){ student=new StudentBean(); student.setId(xmlPullParser.getAttributeValue(null,"id")); }else if (student!=null){ if (tagName.equalsIgnoreCase("name")){ student.setName(xmlPullParser.nextText()); }else if (tagName.equalsIgnoreCase("age")){ student.setAge(xmlPullParser.nextText()); } } break; case XmlPullParser.END_TAG: //結束標籤 //如果讀取到結束標籤,而且這個結束標籤是person的話,就把student放入到list,並把student置null,方便下個迴圈重新聲明 if (xmlPullParser.getName().equalsIgnoreCase("person")&&student!=null){ //讀完一個person,可以將他放入到list中 studentlist.add(student); student=null; } } eventType=xmlPullParser.next(); } inputStream.close(); return studentlist; } catch (Exception e) { e.printStackTrace(); } return null; }}
本文出自 “YuanGuShi” 部落格,請務必保留此出處http://cm0425.blog.51cto.com/10819451/1939165
android XMLPullParser讀取xml檔案