Я пытаюсь разобрать XML с собственным парсером Android. При этом я использую учебник IBM в качестве руководства.
КОД
Я тестирую XML со следующей ссылкой. Я пытаюсь вывести из него номер и имя.
https://api.trafiklab.se/sl/realtid/GetSite?stationSearch=Slussen&key=7c4434c36d394e0c99396b8d1c69d9c4
Я создал класс парсера под названием AndroidSaxFeedParser, который выглядит так:
public class AndroidSaxFeedParser extends BaseFeedParser {
static final String ROOT = "http://www1.sl.se/realtidws/";
public AndroidSaxFeedParser(String feedUrl) {
super(feedUrl);
}
public List<Message> parse() {
final Message currentMessage = new Message();
RootElement root = new RootElement(ROOT, "Hafas");
final List<Message> messages = new ArrayList<Message>();
Element sites = root.getChild(SITES);
Element site = sites.getChild(SITE);
site.setEndElementListener(new EndElementListener(){
public void end() {
messages.add(currentMessage.copy());
}
});
site.getChild(NUMBER).setEndTextElementListener(new EndTextElementListener(){
public void end(String body) {
currentMessage.setNumber(body);
}
});
site.getChild(NAME).setEndTextElementListener(new EndTextElementListener(){
public void end(String body) {
currentMessage.setName(body);
}
});
try {
Xml.parse(this.getInputStream(), Xml.Encoding.UTF_8, root.getContentHandler());
} catch (Exception e) {
throw new RuntimeException(e);
}
return messages;
}
}
BaseFeedParser, который расширяет класс выше, выглядит следующим образом:
public abstract class BaseFeedParser implements FeedParser {
// names of the XML tags
static final String SITES = "Sites";
static final String SITE = "Site";
static final String NUMBER = "Number";
static final String NAME = "Name";
private final URL feedUrl;
protected BaseFeedParser(String feedUrl){
try {
this.feedUrl = new URL(feedUrl);
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
protected InputStream getInputStream() {
try {
return feedUrl.openConnection().getInputStream();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
Я называю синтаксический анализатор следующим образом:
AndroidSaxFeedParser parser = new AndroidSaxFeedParser("https://api.trafiklab.se/sl/realtid/GetSite?stationSearch=Slussen&key=7c4434c36d394e0c99396b8d1c69d9c4");
List<Message> messages = parser.parse();
(Я не включаю класс Message, так как проблема не должна быть там, у него никогда не будет возможности обработать сообщения)
ПРОБЛЕМА
Никто из слушателей в AndroidSaxFeedParser никогда ничего не слышит. Когда я помещаю в них точки останова, они никогда не срабатывают. Я вижу, что сайты и сайт Elements правильно подобраны (я могу видеть релевантные данные в переменных). Он заканчивается окончательной строкой Xml.parse(), которая выполняется правильно, но возвращает пустой результат.
Любые идеи, в которых я ошибаюсь? Благодарю!
Ну, я не смог заставить его работать с парсером Android SAX, поэтому я переключился на класс XmlPullFeedParser, а также в соответствии с примерами IBM. Это без проблем. Дешевое решение, но это нужно будет сделать.
Я бы опубликовал код, но, тестируя его, я также переключился на другой вызов XML, поэтому синтаксический анализ отличается от описанного выше.
Я попытался следовать учебнику IBM и нашел его бесполезным.
В конце я нашел новый пример и написал этот учебник, он анализирует канал RSS, но те же принципы применимы к любому XML.