1

Android 独自のパーサーで XML を解析しようとしています。これを行うときは、 IBM チュートリアルをガイドとして使用しています。

コード

私がテストしている 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() 行まで実行されますが、空白の結果が返されます。

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

4

2 に答える 2

1

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

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

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

于 2012-05-13T20:33:18.200 に答える
0

AndroidのSAXパーサーで動作させることができなかったので、代わりにXmlPullFeedParserクラスに切り替えました.IBMの例によると. これは問題なく動作しました。安価なソリューションですが、それを行う必要があります。

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

于 2012-05-17T09:33:22.653 に答える