Android XML當(dāng)中的Pull方式
提醒大家Android系統(tǒng)還提供了另一種XML解析方式可以使你更好的處理這種情況,就是Pull方式解析XML數(shù)據(jù)。
Pull解析器和SAX解析器雖有區(qū)別但也有相似性。他們的區(qū)別為:SAX解析器的工作方式是自動將事件推入注冊的事件處理器進(jìn)行處理,因此你不能控制事件的處理主動結(jié)束;而Pull解析器的工作方式為允許你的應(yīng)用程序代碼主動從解析器中獲取事件,正因為是主動獲取事件,因此可以在滿足了需要的條件后不再獲取事件,結(jié)束解析。這是他們主要的區(qū)別。
而他們的相似性在運行方式上,Pull解析器也提供了類似SAX的事件(開始文檔START_DOCUMENT和結(jié)束文檔END_DOCUMENT,開始元素START_TAG和結(jié)束元素END_TAG,遇到元素內(nèi)容TEXT等),但需要調(diào)用next() 方法提取它們(主動提取事件)。
Android系統(tǒng)中和Pull方式相關(guān)的包為org.xmlpull.v1,在這個包中提供了Pull解析器的工廠類XmlPullParserFactory和Pull解析器XmlPullParser,XmlPullParserFactory實例調(diào)用newPullParser方法創(chuàng)建 XmlPullParser解析器實例,接著XmlPullParser實例就可以調(diào)用getEventType()和next()等方法依次主動提取事 件,并根據(jù)提取的事件類型進(jìn)行相應(yīng)的邏輯處理。
下面我們就用上面介紹的Pull方式來實現(xiàn)解析XML形式的USGS地震數(shù)據(jù)的Demo例子。
程序首先也是定義解析用到的變量,在定義的用于解析xml數(shù)據(jù)的方法中
public ArrayList<EarthquakeEntry> parse(InputStream inStream)
定義了一個局部變量
boolean isDone = false;
用于標(biāo)志在有滿足條件時停止讀取XML文檔,退出解析過程。
主體部分首先創(chuàng)建XmlPullParser。
我們來看看代碼:
- //創(chuàng)建XmlPullParser,有兩種方式
 - //方式一:使用工廠類XmlPullParserFactory
 - XmlPullParserFactory pullFactory = XmlPullParserFactory.newInstance();
 - XmlPullParser xmlPullParser = pullFactory.newPullParser();
 - //方式二:使用Android提供的實用工具類android.util.Xml
 - XmlPullParser xmlPullParser = Xml.newPullParser();
 
創(chuàng)建XmlPullParser有兩種方式,一種是使用我們介紹的org.xmlpull.v1包中的工廠類XmlPullParserFactory。除了這種方式外,還可以使用android sdk提供的實用工具包android.util中的類Xml的newPullParser()方法直接創(chuàng)建。
接著為pull解析器設(shè)置要解析的xml文檔數(shù)據(jù),并使用主動的方式獲取解析器中的事件.
- 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ù)據(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);
 















 
 
 
 
 
 
 