我想在从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
答案 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)。如果有人偶然发现了这个问题谁不知道:您可以使用AsyncTask
和publishProgress
(在您的代码中称为“工作人员”主题)和onProgressUpdate
(由Android调用)一旦你调用publishProgress
)方法就可以在UI线程上处理它。