2012-05-13 17 views
1

私はAndroid独自のパーサーでXMLを解析しようとしています。これを行う際に私はIBM tutorialを参考にしています。Android XMLパーサーが解析されない

CODE

私がテストしてるXMLは、次のリンクです。私はそれから数と名前を解析しようとしています。上記のクラスは、このようなルックスを拡張すること

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と呼ばれるパーサークラスを設定している

https://api.trafiklab.se/sl/realtid/GetSite?stationSearch=Slussen&key=7c4434c36d394e0c99396b8d1c69d9c4 

このように:

AndroidSaxFeedParser parser = new AndroidSaxFeedParser("https://api.trafiklab.se/sl/realtid/GetSite?stationSearch=Slussen&key=7c4434c36d394e0c99396b8d1c69d9c4"); 
List<Message> messages = parser.parse(); 

(私は問題があってはならないことから、それはメッセージを処理する機会を得ることはありませんMessageクラスを含めないよ)

PROBLEMこれまでAndroidSaxFeedParserでリスナーの

なし何かを聞く。それらの中にブレークポイントを置くと、決してトリガーされません。私は、Elementsサイトとサイトが適切にピックアップされていることを確認しています(変数に関連するデータが表示されています)。最終的に実行されるXml.parse()行まで実行されますが、空白の結果が返されます。

私は間違っていますか?ありがとう!

答えて

0

私もIBM's examplesに応じて、代わりにXmlPullFeedParserクラスに切り替えるので、まあ、私はそれがAndroidのSAXパーサーでの作業を取得することができませんでした。これは問題なく動作しました。安い解決策、それはする必要があります。

私はコードを投稿したいと思いますが、テスト中に別のXML呼び出しに切り替えたので、解析は上記とは異なります。

1

私はIBMチュートリアルに従いましたが、役に立たないことがわかりました。

最後に、私は新しい例を見つけてこのチュートリアルを書いて、RSSフィードを解析しますが、同じ原則がXMLに適用されます。

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

+0

とても簡単です。ありがとうございます。誰も私がすでに持っているものに簡単な解決策を見つけることができなければ、私はそれを試してみます。 DOMよりもSAXを使いたいと思っていましたが(これはあなたの例が使用していると思います)、多分問題はありません。 – mattboy

関連する問題