Android XML解析器不解析

Android XML解析器不解析

问题描述:

我试图用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()行,该行正确执行但返回空白结果。

任何想法我错了吗?谢谢!

嗯,我无法把它与Android的SAX解析器工作,所以我切换到XmlPullFeedParser类代替,也可根据IBM's examples。这工作没有任何问题。便宜的解决方案,但它将不得不做。

我会发布代码,但在测试时我也切换到了不同的XML调用,因此解析与上面不同。

我试图按照IBM教程,发现它是徒劳的。

最后我找到了一个新的例子,写了本教程,它解析了一个RSS feed,但同样的原则适用于任何XML。

http://droidapp.co.uk/?p=166

+0

看起来够简单,谢谢。如果没有人能找到我已有的简单解决方案,我会试试看。我也希望使用SAX而不是DOM(我认为这就是你的例子使用的),尽管它可能并不重要。 – mattboy