使用 SAX Parser 进行 Android XML 解析

Posted

技术标签:

【中文标题】使用 SAX Parser 进行 Android XML 解析【英文标题】:Android XML parsing using SAX Parser 【发布时间】:2011-12-05 13:54:58 【问题描述】:

我一直在尝试使用 SAX 解析器解析这个 (http://app.calvaryccm.com/mobile/android/v1/devos) URL:http://android-er.blogspot.com/2010/05/simple-rss-reader-iii-show-details-once.html 我一直在研究如何处理 XML 中的描述标签。我已经尝试过使用和不使用 CDATA 标记,但似乎没有任何帮助。就像链接被读入描述一样。

第一部分效果很好:

当我尝试访问内页时会出现问题。这几乎就像是在描述标签之前读取链接标签。

我在让描述标签正确显示时遇到问题。感谢您的帮助!

编辑此应用程序的完整源代码在这里:http://dl.dropbox.com/u/19136502/CCM.zip

【问题讨论】:

你使用的代码和例子一样吗?如果您编辑了代码,请在此处提供。 你想从描述标签中得到什么值??和任何其他值 “抱歉,此下载链接已不存在” ....来自http://justbeamit.com/95152 对不起!链接现已修复。 我没有发现任何错误和错误,示例链接工作正常,无需任何更改。准确告诉我您在哪个列表项中得到了错误的描述? 【参考方案1】:

哎呀,在挖掘和分析您的源代码大约 3 小时后,我找到了您出现上述这种奇怪结果的原因。

先看你解析的链接里的RSS内容:http://app.calvaryccm.com/mobile/android/v1/devos

部分内容:

<?xml version="1.0" encoding="utf-8"?> <rss version="2.0"> <channel> <title>CCM Daily Devotions</title> <link>http://www.calvaryccm.com/resources/dailydevotions.aspx</link> <description>Calvary Chapel Melbourne's Daily Devotionals</description> <webMaster>webmaster@calvaryccm.com (Calvary Chapel Melbourne)</webMaster> <copyright>(c)2011, Calvary Chapel Melbourne. All rights reserved</copyright> <ttl>60</ttl> <item> <guid isPermaLink="false">b3e91cbf-bbe9-4667-bf4c-8ff831ba09f1</guid> <title>Teachable Moments</title> <description>Based on &amp;ldquo;Role Models, Part 4&amp;rdquo; by Pastor Mark Balmer; 10/8-9/11, Message #6078; Daily Devotional #6 - &amp;ldquo;Teachable Moments&amp;rdquo; Preparing the Soil (Introduction): My husband and I took seriously our understanding of God&amp;rsquo;s instructions to teach His commandments to our children. (Deuteronomy 6:7) We went to our local Christian bookstore and bought children&amp;rsquo;s Bibles, studies, coloring books, games&amp;mdash;anything that would help us to communicate biblical situations in their lives. Planting and Watering the Seed (Growth): Each parent needs to take seriously God&amp;rsquo;s commthe Crop (Action/Response): Life is God&amp;rsquo;s clas-s-room for teachable moments. A long delay in traffic can be a frustrating irritation, or it can be an opportunity to teach our children that God&amp;rsquo;s than taught. Cultivating (Additional Reading): Psalm 78:1-8;&amp;nbsp;Psalm 145:4 klw Calvary Chapel of Melbourne; 2955 Minton Road; W. Melbourne, FL 32904; 321-952-9673 NLT = New Living Translation. </description> <link>http://www.calvaryccm.com/resources/dailydevotions.aspx</link> <pubDate>Sun, 16 Oct 2011 12:00:00 GMT</pubDate> </item>

密切关注/rss/channel/item/description这个标签,你可以看到这些东西:rsquo;'squo;&amp;amp;ldquo;rdquo;......那些是转义字符(左单引号、右单引号、& 符号、右双引号、左双引号……甚至新行),它们都驻留在 XML 内容中。

所以当XML Parser 遍历这些字符时,它会考虑逃避解析,这会导致你现在面临的奇怪结果。

解决方案呢?起初,我可以想到先获取URL 的内容,然后取消转义这些字符(添加 SLASH 字符),现在我认为您可以再次成功解析它。 这个解决方案似乎运作良好,但是,我认为它可能不会,因为来自服务器的 RSS 文本内容响应的格式非常奇怪(格式不正确)。因此,如果您可以联系该网络管理员,请告诉他们在发出 RSS 订阅之前,将RSS content 格式化(例如添加 SLASH 转义字符,删除所有换行符...)。

其他解决方案是使用一些第三方来处理转义/取消转义的东西,例如来自Apache CommonsStringEscapeUtils:http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/StringEscapeUtils.html 或JTidy。 但我不认为这些库最适合您的情况。

我只能说这些了。

@p/s:只是你的源代码的一些 cmets,我认为你需要考虑让你的代码清晰易读,更好地维护,并适当地重新打包。

【讨论】:

查看我改进的 RSS 提要,这就是问题所在http://app.calvaryccm.com/mobile/android/v1/devos

以上是关于使用 SAX Parser 进行 Android XML 解析的主要内容,如果未能解决你的问题,请参考以下文章

Android SAX XML Parser Access Enclosure 标签 URL 属性

使用 SAX Parser,获取属性的值

XML Pull Parser 和 SAX Parser 有啥区别

使用 Sax Parser、Java 处理 XML 中的空标签

如何在 Java 中使用 SAX Parser 检查 xml 标签是不是具有属性?

如何使用 SAX 解析器解析名称空间?