我可以使用SAX解析器快速获取指定标记的值吗?

时间:2013-01-18 21:39:10

标签: android xml parsing

我想在从XML Feed导入文章时创建一个进度条。

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

我的想法是,在PHP中执行此操作会快得多,并将“count”添加到Feed本身 - 就像这样:

<?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

2 个答案:

答案 0 :(得分:0)

您可以使用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

答案 1 :(得分:0)

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

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

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