我正在尝试使用Android自己的解析器解析XML。我这样做是以IBM tutorial为指导。
代码
我正在测试的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()行,该行正确执行但返回空白结果。
我出错的任何想法?谢谢!
答案 0 :(得分:1)
答案 1 :(得分:0)
好吧,我无法使用Android的SAX解析器,所以我转而使用XmlPullFeedParser类,同样根据IBM's examples。这没有任何问题。廉价的解决方案,但它必须要做。
我发布了代码,但在测试时我也切换到了不同的XML调用,因此解析与上面的不同。