您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Android XML當(dāng)中的Pull方式是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Android XML當(dāng)中的Pull方式是什么”吧!
提醒大家Android系統(tǒng)還提供了另一種XML解析方式可以使你更好的處理這種情況,就是Pull方式解析XML數(shù)據(jù)。
Pull解析器和SAX解析器雖有區(qū)別但也有相似性。他們的區(qū)別為:SAX解析器的工作方式是自動(dòng)將事件推入注冊(cè)的事件處理器進(jìn)行處理,因此你不能控制事件的處理主動(dòng)結(jié)束;而Pull解析器的工作方式為允許你的應(yīng)用程序代碼主動(dòng)從解析器中獲取事件,正因?yàn)槭侵鲃?dòng)獲取事件,因此可以在滿足了需要的條件后不再獲取事件,結(jié)束解析。這是他們主要的區(qū)別。
而他們的相似性在運(yùn)行方式上,Pull解析器也提供了類似SAX的事件(開始文檔START_DOCUMENT和結(jié)束文檔END_DOCUMENT,開始元素START_TAG和結(jié)束元素END_TAG,遇到元素內(nèi)容TEXT等),但需要調(diào)用next() 方法提取它們(主動(dòng)提取事件)。
Android系統(tǒng)中和Pull方式相關(guān)的包為org.xmlpull.v1,在這個(gè)包中提供了Pull解析器的工廠類XmlPullParserFactory和Pull解析器XmlPullParser,XmlPullParserFactory實(shí)例調(diào)用newPullParser方法創(chuàng)建 XmlPullParser解析器實(shí)例,接著XmlPullParser實(shí)例就可以調(diào)用getEventType()和next()等方法依次主動(dòng)提取事 件,并根據(jù)提取的事件類型進(jìn)行相應(yīng)的邏輯處理。
下面我們就用上面介紹的Pull方式來(lái)實(shí)現(xiàn)解析XML形式的USGS地震數(shù)據(jù)的Demo例子。
程序首先也是定義解析用到的變量,在定義的用于解析xml數(shù)據(jù)的方法中
public ArrayList<EarthquakeEntry> parse(InputStream inStream)
定義了一個(gè)局部變量
boolean isDone = false;
用于標(biāo)志在有滿足條件時(shí)停止讀取XML文檔,退出解析過程。
主體部分首先創(chuàng)建XmlPullParser。
我們來(lái)看看代碼:
//創(chuàng)建XmlPullParser,有兩種方式 //方式一:使用工廠類XmlPullParserFactory XmlPullParserFactory pullFactory = XmlPullParserFactory.newInstance(); XmlPullParser xmlPullParser = pullFactory.newPullParser(); //方式二:使用Android提供的實(shí)用工具類android.util.Xml XmlPullParser xmlPullParser = Xml.newPullParser();
創(chuàng)建XmlPullParser有兩種方式,一種是使用我們介紹的org.xmlpull.v1包中的工廠類XmlPullParserFactory。除了這種方式外,還可以使用android sdk提供的實(shí)用工具包android.util中的類Xml的newPullParser()方法直接創(chuàng)建。
接著為pull解析器設(shè)置要解析的xml文檔數(shù)據(jù),并使用主動(dòng)的方式獲取解析器中的事件.
xmlPullParser.setInput(inStream, "UTF-8"); int eventType = xmlPullParser.getEventType();
我們***添加AndroidXMLDemoPull.java文件中的內(nèi)容
public class AndroidXMLDemoPull extends Activity { /** Called when the activity is first created. */ //定義顯示的List相關(guān)變量 ListView list; ArrayAdapter<EarthquakeEntry> adapter; ArrayList<EarthquakeEntry> earthquakeEntryList; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //獲取地震數(shù)據(jù)流 InputStream earthquakeStream = readEarthquakeDataFromFile(); //Pull方式進(jìn)行xml解析 PullEarthquakeHandler pullHandler = new PullEarthquakeHandler(); earthquakeEntryList = pullHandler.parse(earthquakeStream); //用ListView進(jìn)行顯示 list = (ListView)this.findViewById(R.id.list); adapter = new ArrayAdapter<EarthquakeEntry>(this, android.R.layout.simple_list_item_1, earthquakeEntryList); list.setAdapter(adapter); } private InputStream readEarthquakeDataFromFile() { //從本地獲取地震數(shù)據(jù) InputStream inStream = null; try { inStream = this.getAssets().open("USGS_Earthquake_1M2_5.xml"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return inStream; } private InputStream readEarthquakeDataFromInternet() { //從網(wǎng)絡(luò)上獲取實(shí)時(shí)地震數(shù)據(jù) URL infoUrl = null; InputStream inStream = null; try { infoUrl = new URL("http://earthquake.usgs.gov/earthquakes/catalogs/1day-M2.5.xml"); URLConnection connection = infoUrl.openConnection(); HttpURLConnection httpConnection = (HttpURLConnection)connection; int responseCode = httpConnection.getResponseCode(); if(responseCode == HttpURLConnection.HTTP_OK) { inStream = httpConnection.getInputStream(); } } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return inStream; } }
只是把進(jìn)行XML解析的部分換成了如下方式:
//Pull方式進(jìn)行xml解析 PullEarthquakeHandler pullHandler = new PullEarthquakeHandler(); earthquakeEntryList = pullHandler.parse(earthquakeStream);
到此,相信大家對(duì)“Android XML當(dāng)中的Pull方式是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。