1

こんにちは、Wiki からデータを取得する Android アプリを作成中です。最初は HTML を解析する方法を見つけることを計画していましたが、誰かが私に指摘したことから、XML の方がはるかに簡単です。と連携。今、私は XML を正しく解析する方法を見つけようとして立ち往生しています。現在、次の Web アドレスから解析しようとしています。

http://zelda.wikia.com/api.php?action=query&list=categorymembers&cmtitle=Category:ゲーム&cmlimit=500&format=xml

各ゲームのタイトルを文字列配列に取得しようとしていますが、問題が発生しています。私が試したコードの例はありません。xmlpullparser を使用したものです。アプリで何かをしようとするたびに、アプリがクラッシュします。XML をローカルに保存して、そこから解析したほうがよいでしょうか? それともウェブアドレスから行ってもいいですか?これを正しく解析して文字列配列にするにはどうすればよいですか?私を助けてください、そしてこれを読むために時間を割いてくれてありがとう。

今夜遅くに入手できるコードや何かを確認する必要がある場合は、現時点で PC の近くにいないだけです。ありがとうございました。

4

1 に答える 1

3

あなたの例のような単純な形式のパーサー コードを書いていることに気付いたときはいつでも、ほとんどの場合、何か間違ったことをしており、適切なフレームワークを使用していません。

たとえばandroid.sax、SDK に含まれるパッケージには XML を解析するための単純なヘルパーのセットがあり、投稿した例は次のように簡単に解析できます。

public class WikiParser {
    public static class Cm {
        public String mPageId;
        public String mNs;
        public String mTitle;
    }
    private static class CmListener implements StartElementListener {
        final List<Cm> mCms;
        CmListener(List<Cm> cms) {
            mCms = cms;
        }
        @Override
        public void start(Attributes attributes) {
            Cm cm = new Cm();
            cm.mPageId = attributes.getValue("", "pageid");
            cm.mNs = attributes.getValue("", "ns");
            cm.mTitle = attributes.getValue("", "title");
            mCms.add(cm);
        }
    }
    public void parseInto(URL url, List<Cm> cms) throws IOException, SAXException {
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        try {
            parseInto(new BufferedInputStream(con.getInputStream()), cms);
        } finally {
            con.disconnect();
        }
    }
    public void parseInto(InputStream docStream, List<Cm> cms) throws IOException, SAXException {
        RootElement api = new RootElement("api");
        Element query = api.requireChild("query");
        Element categoryMembers = query.requireChild("categorymembers");
        Element cm = categoryMembers.requireChild("cm");
        cm.setStartElementListener(new CmListener(cms));
        Xml.parse(docStream, Encoding.UTF_8, api.getContentHandler());
    }
}

基本的に、次のように呼び出されます。

WikiParser p = new WikiParser();
ArrayList<WikiParser.Cm> res = new ArrayList<WikiParser.Cm>();
try {
    p.parseInto(new URL("http://zelda.wikia.com/api.php?action=query&list=categorymembers&cmtitle=Category:Games&cmlimit=500&format=xml"), res);
} catch (MalformedURLException e) {
} catch (IOException e) {
} catch (SAXException e) {}

編集:List<String>これは、代わりに作成する方法です:

public class WikiParser {
    private static class CmListener implements StartElementListener {
        final List<String> mTitles;
        CmListener(List<String> titles) {
            mTitles = titles;
        }
        @Override
        public void start(Attributes attributes) {
            String title = attributes.getValue("", "title");
            if (!TextUtils.isEmpty(title)) {
                mTitles.add(title);
            }
        }
    }
    public void parseInto(URL url, List<String> titles) throws IOException, SAXException {
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        try {
            parseInto(new BufferedInputStream(con.getInputStream()), titles);
        } finally {
            con.disconnect();
        }
    }
    public void parseInto(InputStream docStream, List<String> titles) throws IOException, SAXException {
        RootElement api = new RootElement("api");
        Element query = api.requireChild("query");
        Element categoryMembers = query.requireChild("categorymembers");
        Element cm = categoryMembers.requireChild("cm");
        cm.setStartElementListener(new CmListener(titles));
        Xml.parse(docStream, Encoding.UTF_8, api.getContentHandler());
    }
}

その後:

WikiParser p = new WikiParser();
ArrayList<String> titles = new ArrayList<String>();
try {
    p.parseInto(new URL("http://zelda.wikia.com/api.php?action=query&list=categorymembers&cmtitle=Category:Games&cmlimit=500&format=xml"), titles);
} catch (MalformedURLException e) {
} catch (IOException e) {
} catch (SAXException e) {}
于 2012-05-26T17:20:17.173 に答える