在Android中解析圣经的最佳方法

时间:2012-10-26 05:06:06

标签: java android xml xml-parsing

我正在创建一个需要访问圣经的Android应用。我希望它离线,所以我不想使用其中一个互联网API。阅读此this帖后,我决定将文本本地存储为XML,如此

<bible>
<b n="Genesis">
<c n="1">
<v n="1">In the beginning, God created the heavens and the earth.</v>

我的问题是该文件大约有34,000行(4.4 MB),需要很长时间(几分钟)来解析整个文本。

现在我正在使用XmlPullParser,就像这样

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xpp = factory.newPullParser();

InputStream iStream = getResources().openRawResource(R.raw.bible);
BufferedReader reader = new BufferedReader(new InputStreamReader(iStream));
xpp.setInput(reader);

int eventType = xpp.getEventType();

while (eventType != XmlPullParser.END_DOCUMENT)
{
    // do something here
    eventType = xpp.next();
}

有没有更好的方法在Android上本地存储和/或访问圣经?

我考虑将其存储为多个XML文件以便更快地解析它(每本书都有一个单独的文件),但如果可能的话,我不愿意这样做。

我愿意接受任何建议,包括将文本存储为XML以外的其他内容。

由于

3 个答案:

答案 0 :(得分:5)

- 首先解析 XML使用SAX, DOM, or Pull Parser,或者您可以尝试一些非常棒的库JAXP and JAXB or the infamous Castor。< / p>

- 其次,您可以将圣经本地存储到SQLite数据库中,因为SQLite只是一个单个文件,没有任何服务器,它的工作速度更快。它可以小到250K。

///////////////////编辑部分/////////////////////// ////////

- 保持 UI在UI线程上工作,非UI在非UI线程上工作总是更好,但这变成了 LAW < / strong>随着HONEYCOMB版Android的到来。

- 因此,您可以使用Thread along with Handler,也可以选择使用Android提供的更简单的选项,即 PainLess Threading ,其{{1} }

- 使用上述方法可以保持AsyncTask 响应,同时在后台执行处理器繁重的工作。

答案 1 :(得分:3)

我只会使用SQLite作为“起点” - 也就是说,为什么不? (嗯,真的,现有的图书馆/图书阅读器/完善的文件架构会更好,但除非: - )

SQLite具有非常高效的“磁盘上”访问权限 - 例如无需“解析”内存或读取整个文件 - 它支持对索引的有效搜索(例如查找特定的诗句或在Exodus中获取第2章到第12章)。我希望SQLite数据库和原始XML文件具有可比较的文件大小(假设XML是UTF-8编码的)。

然后创建一个程序/函数将XML“加载”到SQLite数据库中的相应模式中 - 这可以提前完成(例如在PC上然后分发预填充的SQLite数据库文件)或第一个时间表示XML已加载到客户端上。这可以与现在的读取代码有效相同。只需用“更新数据库”替换“做某事”。

我会避免使用文件分割方法,除非有一个特别好的理由 - 它会使找到特定章节/节目更快,但它并不真正“解决问题”。由于它使用顺序读取器而不是完整的DOM,因此不一定会导致更少的内存 - 它只会在搜索时限制垃圾“读取”(然后丢弃)。但话说回来,为什么不 SQLite?

答案 2 :(得分:1)

我的建议是使用除XML之外的其他内容。请注意,我一般都有针对XML的内容;只是想明确这一点,因为有很多人认为XML对任何东西都不好

以下是在这种情况下使用XML的一些预期后果:

查找时间

这会使您跳到文本中的特定位置总是昂贵。 XML将为您提供两种方法:

  1. 以流式方式阅读整个文档,直到找到您要查找的片段。很慢。
  2. 将整个文档读入内存数据结构,这将允许您从某种位置标识符到实际文本片段创建内存索引。在内存消耗方面非常昂贵。
  3. <强>紧

    将整个圣经转换为XML文件将使其成为 HUGE 。当然还有Fast InfosetEfficient XML等解决方案(Infoset的二进制编码,XML背后的数据模型)。这会有所帮助,但也许不是很多。 Gzip可能会减少到大约。原始大小的1/3,这也会有所帮助,但它仍然很大。

    该怎么做?

    我的建议是考虑你的圣经文本的二进制编码;一个针对快速查找进行了优化的方法。比如,在文件中有索引,将位置(一节)映射到实际文本片段开始的偏移量。如果你正确地做到这一点,甚至可以获得比XML更紧凑的东西。

    <强>哈德吗

    这听起来更难,但实际上,它可能不会。您也可以考虑查看Preon,因为Preon也已在Android上使用,并允许您以声明方式将内存数据结构映射到其二进制编码表示中。框架本身将确定是否有机会从输入文件中懒惰地加载数据。