我正在解析Android应用程序的rss XML新闻Feed。我正在使用SAXParser
,并且所有工作都是按照它应该的方式进行的,但我希望能够限制我检索的故事数量,并且我无法找到这样做的方法。例如,假设有一个新闻源中有45个故事,我只想要最新的10个。现在,我只是将它们全部抓到一个ArrayList
,并且只显示我想要的,最肯定是最我相信这样做的有效方法。将XML SAXParser限制为某个数字或项目
如果需要,我可以提供解析代码。
感谢任何人看着这个!
我正在解析Android应用程序的rss XML新闻Feed。我正在使用SAXParser
,并且所有工作都是按照它应该的方式进行的,但我希望能够限制我检索的故事数量,并且我无法找到这样做的方法。例如,假设有一个新闻源中有45个故事,我只想要最新的10个。现在,我只是将它们全部抓到一个ArrayList
,并且只显示我想要的,最肯定是最我相信这样做的有效方法。将XML SAXParser限制为某个数字或项目
如果需要,我可以提供解析代码。
感谢任何人看着这个!
我不确定是否有办法阻止sax解析器解析。但是,您可以改用XMLPullParser
。
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xpp = factory.newPullParser();
xpp.setInput(yourXML);
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT && list.size() <= MAX_SIZE) {
if (eventType == XmlPullParser.START_TAG) {
//do something
} else if (eventType == XmlPullParser.END_TAG) {
//do something
} else if (eventType == XmlPullParser.TEXT) {
//do something
}
eventType = xpp.next();
}
您可以通过搜索XMLPullParser教程找到很多示例。
注意:我认为如果你只有45个项目解析速度非常快,你可以让萨克斯继续解析。
更新:我觉得它是什么Michael说:
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if(size == MAX_SIZE){
throw new SAXException("end");
}
//...
}
而且当你正在解析:
try{
saxParser.parse(yourXML);
}catch(SAXException e){
if(e.getMessage().equals("end"){
// document has ended
}
}
我刚刚以45为例。如果有几百呢?它不再那么快了。我知道PullParser,但需要了解有关SAX的更多信息。 – WeVie 2014-09-28 14:16:51
@WeVie查看编辑答案。 – 2014-09-28 18:50:23
您可以通过具有任何解析任何更多的输入停止SAX解析器你的回调方法(例如startElement)抛出一个SAXException。
您需要使该异常可识别(例如,通过使用特殊消息文本或使用SAXException的子类),以便当您的parse()原始调用返回异常时,您可以将其与其他解析器失败的原因。
你有一个如何做到这一点的例子吗? – WeVie 2014-09-28 14:12:01
恐怕不是一个简单的问题。 http://grepcode.com/file/repo1.maven.org/maven2/net.sourceforge.saxon/saxon/9.1.0.8/net/sf/saxon/event/PIGrabber.java提供了一般技术示例,但它不直接使用SAX接口,所以事件和例外情况稍有不同。 (这个例子是在文件开始时读取xml-stylesheet处理指令,然后在遇到第一个元素节点时中止解析。) – 2014-09-28 20:39:10
当您将对象添加到arraylist时,只需检查其大小,如果它包含10个元素,则不要添加它。 – 2014-09-28 06:24:30
我想过,但这意味着整个XML仍然会被解析。一旦ArrayList达到所需的大小,我宁愿停止解析。 – WeVie 2014-09-28 06:26:08
您可以在达到所需数量的元素后(或直到没有更多要处理的时间,以先到者为准)在分析操作中分解/返回? – 2014-09-28 06:37:51