2012-06-18 123 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解码图像。你可以检查解码图像的其他问题,以获得你想要的。祝你好运。 ))