5

こんにちは(住んでいる場所によって異なります)!

私はAndroid開発にかなり慣れておらず、現在、既存のiOSアプリからAndroidに機能を移行する作業を行っています。この機能の一部は、約500のエントリを含む「大きな」(約13,000行)RSSXMLファイルを解析することです。私は、AndroidでのXML解析の調査と、主要なXMLパーサーであるDOM、SAX、およびプル解析の試行に10〜15時間費やしました。ボックスのエミュレーター(32ビットWindows Vista、2.2 GHzデュアルCPU、3 GB RAM)内で実行した結果は次のとおりです。

サックス:〜6:00分

プル解析:〜4:00分

DOM:4:00分を超えていますが、その実装をコーディングしたときに時間を計りませんでした。

githubからこのRSSリーダーも試しましたが、10:00分以上かかりました。

https://github.com/matshofman/Android-RSS-Reader-Library

SAX、PP、およびDOMの実装はすべて、stackoverflow.comスレッドから取得されたため、標準以外のことは何もしなかったと確信しています(ただし、それを除外しているわけではありません)。私は、他に何ができるかについていくつかのアイデアを得るために、より多くの経験豊富な群衆にアピールすることにしました。

ファイルの形式を制御することはできません。このエンドツーエンドを実装する場合は、サーバー上ですべての面倒な作業を行ってから、小さくてコンパクトなJSONシリアル化されたリストを送信するWebサービスを作成するだけです。代わりに、13Kのラインファイルがあります。:)

私に何ができるかについての洞察はありますか?これはかなり一般的な問題のようですが、ほとんどの応答は、異なるメインXMLパーサーの1つを試すように言っているだけです。私の場合、3つすべてを試しましたが、最速でも遅すぎるようです。

私は何が間違っているのですか?Androidのネットワーク上でXML解析を行うときに人々が通常遭遇する通常の「初心者」の問題はありますか?

あなたが提供できるどんな助けにも前もって感謝します!

4

2 に答える 2

3

vtd-xmlを使用します。

ここにいくつかのベンチマークがあります。

また、エミュレーターは非常に遅いので、実際のデバイスで試してみると、大幅な改善が見られる可能性があります。

于 2013-01-01T21:30:20.863 に答える
1

私はジェイブの 答えに同意します。最良の選択はVDT-XMLライブラリ です。この例は、このライブラリの使用方法を示しています。

XMLファイル:

 <database name="products">
        <table name="category">
            <column name="catId">20</column>
            <column name="catName">Fruit</column>
        </table>
        <table name="category">
            <column name="catId">31</column>
            <column name="catName">Vegetables</column>
        </table>
        <table name="category">
            <column name="catId">45</column>
            <column name="catName">Rice</column>
        </table>
        <table name="category">
            <column name="catId">50</column>
            <column name="catName">Potatoes</column>
        </table>
</database>

ソースコードの例:

import com.ximpleware.AutoPilot;
import com.ximpleware.VTDGen;
import com.ximpleware.VTDNav;


String fileName = "products.xml";

VTDGen vg = new VTDGen();

if (vg.parseFile(fileName, true)) {

     VTDNav vn = vg.getNav();
     AutoPilot table = new AutoPilot(vn);
     table.selectXPath("database/table");

     while (table.iterate()) {
        String tableName = vn.toString(vn.getAttrVal("name"));

        if (tableName.equals("category")) {
            AutoPilot column = new AutoPilot(vn);
            column.selectElement("column");

            while (column.iterate()) {
                 String text = vn.toNormalizedString(vn.getText());
                 String name = vn.toString(vn.getAttrVal("name"));

                 if (name.equals("catId")) {
                    Log.d("Category ID = " + text);
                 } else if (name.equals("catName")) {
                    Log.d("Category Name = " + text);
                 } 

            }
        }
     }
}

それは私のために働き、それがあなたを助けることを願っています。

于 2015-04-09T15:48:48.107 に答える