我試圖用Android自己的解析器解析XML。這樣做時我使用IBM tutorial作爲指導。Android XML解析器不解析
守則
我用來測試的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();
(我不包括信息類,因爲這個問題不應該在那裏,它從來沒有得到一個機會來處理消息)
問題的方法在該AndroidSaxFeedParser
無聽衆的不斷聽到什麼。當我在它們內部放置斷點時,它們從不被觸發。我看到元素網站和網站被正確拾取(我可以看到變量中的相關數據)。它運行到最終的Xml.parse()行,該行正確執行但返回空白結果。
任何想法我錯了嗎?謝謝!
看起來夠簡單,謝謝。如果沒有人能找到我已有的簡單解決方案,我會試試看。我也希望使用SAX而不是DOM(我認爲這就是你的例子使用的),儘管它可能並不重要。 – mattboy