2014-09-28 3 views
0

Я анализирую ленту новостей rss XML для приложения для Android. Я использую SAXParser, и все работает так, как должно, но я хотел бы ограничить количество историй, которые я извлекаю, и я не могу найти способ сделать это. Например, скажем, что есть 45 историй из одного из новостных лент, и я просто хочу, чтобы самые новые 10. Как и сейчас, я просто хватаю их всех за ArrayList и показываю только те, которые я хочу, что, безусловно, самое большее эффективный способ сделать это, я уверен.Ограничить XML SAXParser определенному числу или элементу

Я могу предоставить код анализа, если это необходимо.

Спасибо всем, кто смотрит на это!

+0

Когда вы добавляете объекты в arraylist, просто проверяйте его размер и не добавляйте к нему, если он содержит 10 элементов. –

+0

Я думал об этом, но это означало бы, что весь XML все равно будет разобран. Я бы предпочел просто прекратить синтаксический анализ, как только «ArrayList» получит желаемый размер. – WeVie

+0

Вы можете просто вырваться/вернуться из операции синтаксического анализа после достижения желаемого количества элементов (или до тех пор, пока больше не будет обработано, в зависимости от того, что наступит раньше)? –

ответ

0

Я не уверен, что существует способ остановить парсер сакса. Однако вместо этого вы можете использовать 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 элементов синтаксического анализа очень быстро, и вы можете позволить sax продолжать синтаксический анализ.

Update: Я думаю, что это то, что Майкл говорит:

@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 
    } 
} 
+0

Я просто использовал 45 в качестве примера. Что, если есть сотни? Это не так быстро. Я знаю PullParser, но вам нужно больше узнать о SAX. – WeVie

+0

@WeVie см. Отредактированный ответ. –

2

Вы можете остановить SAX парсер от разбора больше входа, имея какой-либо ваших методов обратного вызова (например, startElement) выдает исключение SAXException.

Вам нужно будет сделать это исключение узнаваемым (например, с помощью специального текста сообщения или с помощью подкласса SAXException), так что, когда ваш исходный вызов parse() возвращается с исключением, вы можете отличить его от другого причины сбоя парсера.

+0

У вас есть пример того, как это сделать? – WeVie

+0

Боюсь, я не простой. Ниже приведен пример общей техники по адресу 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 в начале файла, а затем прервать анализ, когда встречается первый элемент узла.) –