Kano,
Вы можете упростить свою жизнь и получить первоклассную производительность , используя SJXP для написания этого анализатора RSS-каналов с (отказ от ответственности: я являюсьавтор).
SJXP - это очень-очень тонкий слой абстракции , который расположен поверх API XML Pull Parsing (Android предоставляет свой собственный, поэтому у вас есть только зависимость sjxp.JAR, XPP3для любой другой платформы) и позволяет использовать XPath-подобные правила синтаксического анализа для сопоставления простых правил с определенными местами документа, а затем сообщать при разборе, какую информацию вы хотите получить из этих мест.
Я написал пример проекта Eclipseдля вас, который анализирует этот канал TV2 Sports для вас за 6 минут (я свяжу его внизу).
Основной метод выглядит следующим образом, поэтому вы получите представление о потоке:
public static void main(String[] args) throws IllegalArgumentException,
XMLParserException, IOException {
// Location we want to parse.
URL feedURL = new URL("http://tv2sport.dk/rss/*/*/*/248/*/*");
// List we will hold all parsed stories in.
List<Item> itemList = new ArrayList<Item>();
// Get all the rules we will use to parse this file
IRule[] rules = createRules();
// Create the parser and populate it with the rules.
XMLParser<List<Item>> parser = new XMLParser<List<Item>>(rules);
// Parse the RSS feed.
parser.parse(feedURL.openStream(), itemList);
// Print the results.
System.out.println("Parsed " + itemList.size() + " RSS items.");
for (Item i : itemList)
System.out.println("\t" + i);
}
Вы видите, что процесс начинается с создания нашего Списка для хранения наших Предметов, когда мы анализируем их из документа.Затем мы получаем набор IRule экземпляров для парсера, затем создаем парсер и даем ему правила для использования во время работы.
Затем мы вызываем метод parse для содержимогопередать и передать ему то, что называется «пользовательским объектом», точнее, просто экземпляром чего-либо, что мы хотим, чтобы оно передавало правилам при их выполнении.
В этом случае нам нужен доступв наш список, чтобы мы могли добавлять в него элементы, поэтому мы просто передаем это, и синтаксический анализатор передает его прямо в нашу IRule логику , когда она выполняется, чтобы мы могли ее использовать.
Класс Item использует простой POJO для хранения данных и делает печать приятной:
public class Item {
public String title;
public String description;
@Override
public String toString() {
return "Item [title='" + title + "', description='" + description + "']";
}
}
Все интересное происходит в вашей IRule, где вы определяете, на какой элемент вы нацеливаетесь (символьные данные, атрибуты).данные или просто пометить события открытия / закрытия), а затем переопределить соответствующий метод из интерфейса IRule, чтобы предоставить обработчик, который что-то делает.
Например, вот обработчик, который анализирует заголовки:
IRule<List<Item>> itemDescRule = new DefaultRule<List<Item>>(Type.CHARACTER, "/rss/channel/item/description") {
@Override
public void handleParsedCharacters(XMLParser<List<Item>> parser, String text, List<Item> userObject) {
Item item = userObject.get(userObject.size() - 1);
item.description = text;
}
};
Вы видите, что получаете сам экземпляр экземпляра синтаксического анализатора (так что вы можете вызвать метод 'stop', если хотите досрочно прекратить анализ), вы получаететекст, который представлял собой символьные данные, и вы получаете тот «объект пользователя», который оказался нашим списком, переданным вам.
Мы берем элемент, который заполняем, из списка, даем ему описание, и этоЭто.2 строки кода.
Существует еще одна IRule, которая добавляет новый элемент в список каждый раз, когда встречается открытый тег, и это позволяет нашим последующим правилам, таким как это, просто выталкивать конечный элемент изперечислите и заполните его.
Когда вы запускаете проект, результат будет выглядеть следующим образом:
Parsed 50 RSS items.
Item [title='Barcas bøddel beæret over Barca-føler', description='Tirsdag snød Thiago Silva Barcelona for tre point, da han headede AC Milans udligning i kassen i Champions League-kampens overtid.']
Item [title='Guardiola: Pato hurtigere end Usain Bolt', description='FC Barcelona-træner, Josep Guardiola, er dybt imponeret af Milan-målscoreren Alexandre Patos hurtighed.']
Item [title='Milan-profil: Vi kan nå semifinalen', description='Clarence Seedorf mener, at AC Milan kan nå semifinalerne i Champions League efter 2-2 i Barcelona.']
<SNIP...>
Вы можете скачать весь проект Eclipse, который я создал для вас здесь .
Надеюсь, это поможет.