【问题标题】:Can I get the value of a specified tag quickly with SAX parser?我可以使用 SAX 解析器快速获取指定标签的值吗?
【发布时间】:2013-01-02 16:52:45
【问题描述】:

我想在从 XML 提要导入我的文章时制作一个进度条。

解析工作正常,但对于我的进度条,我需要快速知道提要中<item>s 的总数,以便确定已加载的百分比。

我的想法是,在 PHP 中执行此操作并将“计数”添加到提要本身会快得多 - 如下所示:

<?xml version="1.0" encoding="utf-8"?>
<channel>
<title>My Apps Feed</title>
<link>http://link_to_this_fiel</link>
<language>en-us</language>
<count>42</count>

但是我需要能够快速访问那个“计数”数字。

目前,我有一个 RSSHandler.java,其名称如下:

//Add all items from the parsed XML
for(NewsItem item : parser.getParsedItems())
{
    //...

注意:我的应用的最低 API 级别 8

【问题讨论】:

    标签: android xml parsing


    【解决方案1】:

    您可以使用 Xpath 来获取 XML 中的特定节点值。示例是:

    SAXBuilder builder = new SAXBuilder();
    Document doc = builder.build(.....); // get document for your xml here
    Element elem = (Element) XPath.selectSingleNode(doc, "channel/count");
    System.out.println(elem.getValue());
    

    这样可以直接获取计数值。但我不确定这是实现此目的的有效且更快的方法。作为一个选项,您可以使用它。 也花一些时间阅读这个:SAX parsing - efficient way to get text nodes

    【讨论】:

    • 我应该在我的问题中提到,但我的 minSdk 级别(或任何所谓的)是 8。似乎 XPath 需要 17。
    【解决方案2】:

    SAX 按照它们进入的顺序读取标签。确保将您的标签放在 XML 的开头,否则无论如何您都需要解析它。为了更容易解析,我将其放入具有唯一名称的自闭合标签的属性中。然后等待 SAX 解析器调用您的 startElement 方法,检查标签名称是否与您的计数标签名称匹配,提取属性,并将其显示给用户。

    如果您想在显示计数后停止解析器,您可以抛出SAXException 来执行此操作。

    我假设您已经知道如何在主线程外进行解析工作,因为您提到了一个进度条并暗示解析可能需要一些时间(并且在主线程上执行长任务会给您带来 ANR)。如果有人偶然发现了这个不知道的问题:您可以使用AsyncTaskpublishProgress(由您的代码在“worker”线程中调用)和onProgressUpdate(一旦您在 UI 线程上调用 Android调用publishProgress) 方法来解决这个问题。

    【讨论】:

    • 所以你建议我运行导入,然后抛出异常来检索计数,然后再次运行导入?
    • 如果您已经在 AsyncTask 中使用 SAX 进行解析并且仍然想导入文件,只需将 count 标记的特殊情况添加到您的 startElement 方法即可。这种特殊情况应该设置一个“total items”变量,否则忽略标签。然后,每当您完成对项目的解析时,您都会检查该 var 是否已设置,并使用 publishProgress 来更新栏。如果您不想解析,则只需要抛出异常,或者由于一些其他限制而难以实现这样的东西。
    猜你喜欢
    • 1970-01-01
    • 2012-05-09
    • 2012-07-22
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 2011-01-27
    • 2012-02-06
    • 2012-10-19
    相关资源
    最近更新 更多