2012-05-13 157 views
1

我試圖用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()行,該行正確執行但返回空白結果。

任何想法我錯了嗎?謝謝!

回答

0

嗯,我無法把它與Android的SAX解析器工作,所以我切換到XmlPullFeedParser類代替,也可根據IBM's examples。這工作沒有任何問題。便宜的解決方案,但它將不得不做。

我會發布代碼,但在測試時我也切換到了不同的XML調用,因此解析與上面不同。

1

我試圖按照IBM教程,發現它是徒勞的。

最後我找到了一個新的例子,寫了本教程,它解析了一個RSS feed,但同樣的原則適用於任何XML。

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

+0

看起來夠簡單,謝謝。如果沒有人能找到我已有的簡單解決方案,我會試試看。我也希望使用SAX而不是DOM(我認爲這就是你的例子使用的),儘管它可能並不重要。 – mattboy