2012-06-18 122 views
0

我正在閱讀Head First Android開發書。在第三章中,他們嘗試從here製作來自NASA RSS訂閱源的應用程序。
在這本書中,作者使用了用於Java的SAX parser。我在網上查看,並在這裏的一些答案建議,SAX已過時並有更新的解決方案。解析Android應用程序的RSS提要? jsoup答案是?

但是我不確定更容易使用的是Java。我用NokogiriRuby和類似的東西會很棒。我看着jsoup,它看起來很好,但我想知道你們有什麼建議。

+0

看到這個鏈接http://www.androidhive.info/也許對你有幫助。 –

+0

看看這個鏈接http://www.ibm.com/developerworks/xml/library/x-androidxml/index.html – Aamirkhan

回答

0

我是Jsoup的忠實粉絲。我最近纔開始使用它,它的驚人之處。我曾經寫過一些超級毛茸茸的正則表達式來進行模式匹配,因爲我想避免像瘟疫一樣的SAX ......而且你可以想象這很乏味。 Jsoup讓我通過幾行代碼解析出<表中的特定項目。

比方說,我想採取表格的前7行,其中< tr class = ...>是GridItem或GridAltItem。然後,假設我們要打印第1,第2和第3列作爲文本,然後打印出現在行中的第一個href>鏈接。聽起來很愚蠢,但我必須這樣做,我可以很容易地做到這一點:

String page = "... some html markup fetched from somewhere ..."; 
Document doc = Jsoup.parse(page); 
for(int x=0; x< 7; x++) { 
    Element gridItem = doc.select("tr[class$=Item]").select("tr").get(x); 
    System.out.println("row: " + gridItem.select("td").get(0).text() + " " + gridItem.select("td").get(1).text() + " " + gridItem.select("td").get(4).text() + " " + gridItem.select("a").get(0).attr("href")); 
} 

它與Jsoup簡單。確保你的Jsoup jar文件作爲一個庫添加到您的項目並導入那些你需要的類:你不希望導入錯誤的文檔或元素類...

import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 

享受!

0

我認爲SAX是一個默認的方式acheive它,在嘗試新的東西雖然:)

1

我頭第一個Android開發的作者,所以只是想有一些想法附和沒有boundations。 SAX確實有點繁瑣,但很直接,並且已經在Android中內置了一段時間(因此決定在本書中使用它)。我也是Rails開發者,我是nokogiri的忠實粉絲,經常使用它。看着jsoup,我可以肯定地看到它很有用。這就是說,我沒有嘗試過,所以我不能給它任何第一手經驗。

另一種選擇是安裝在Android中的XML PullParser。它仍然非常類似SAX,但功能更全面。

希望這會有所幫助。

+0

Johathan我喜歡你的書,但我也很喜歡XML解析器。第3章github上的代碼目前不工作,我想知道它們是否會很快被修復?我正在考慮在嘗試修改解析器失敗後嘗試創建自己的解析器(瞭解它,但應用程序強制關閉= /)。謝謝! –

0

自從version 1.6.2以來,Jsoup也正式支持XML解析。這樣就可以解析XML並使用類似jQuery的CSS選擇器來選擇元素。要創建具有Jsoup一個XML文檔,你需要以下的,而不是Jsoup#parse()方法:

Document document = Parser.xmlParser().parseInput(xmlString, ""); 
// ... 

這樣的投入將不會隱被視爲HTML5(所以,沒有自動列入<html><head>標籤等)。

1

第3章中的代碼停止,因爲Android不支持其主線程中的網絡連接。

因此,您可以使用任何解析器,如XmlPullParser,但確保您執行網絡(下載飼料等)關閉它的主線程。您可以使用AsyncTask在主線外進行聯網..或創建一個新線程()並在該線程中進行聯網(推薦)

實際上,在第4章中他們實際上創建了一個新的線程來執行網絡。所以,如果你使用chapter4代碼,那麼它會起作用。

您可能會遇到的另一個問題是OutOfMemoryError,因爲這些天Nasa的日常圖片真的很大。所以你必須用inSampleSize解碼圖像。你可以檢查解碼圖像的其他問題,以獲得你想要的。祝你好運。 ))