2011-08-02 19 views
0

私はXmlPullParserを使用して、ローカルに保存されたXML文書からアンドロイドアプリケーションでフォームを生成しています。XmlPullParserがトップレベル要素のリストを返すようにするにはどうすればよいですか?

XmlPullParser xpp = getResources().getXml(R.xml.calculator); 
int eventType = xpp.getEventType(); 

そして、私はツリー内のすべての要素を処理するwhileループを持っています。しかし、私はこれは実際に私は(ユーザーが質問をしてツリーをドリルダウン)物事の幅優先方法をしたい深さ優先の方法である

eventType = xpp.next(); 

を使い続ける理由。 XMLチュートリアルのほとんどは、メモリの制約のためにアンドロイドでは信頼できないと聞いたDOMに依存しています。私は助けに非常に感謝しています。

XMLは、私はそれはそれは以前よりもう少し理にかなって願っています。このフォーム

<top> 
    <page> 
    <question>This is the first question</question> 
    <answer> 
     <text>Answer 1</text> 
     <page> 
       <question>If you choose Answer 1 you get asked this question</question> 
       <answer> 
       . 
       . 
       </answer> 
       <answer> 
       . 
       . 
       </answer> 
     </page> 
    </answer> 

    <answer> 
     <text>Answer 2</text> 
     . 
     . 
     . 
    </answer> 

    </page> 
</top> 

です。したがって、このツリーが与えられると、ユーザーにこれらの質問をして答えを出す画面を(実行時に)生成したいと思っています。回答によっては、次の質問が出ます。本当に素早い返答をありがとう!

答えて

0

breadfirstアルゴリズムは、第1レベルのノードを取得するのに直感的にもっと効率的であると思われます。しかし、これは非常に "人間的な"アプローチのようです。私は、XMLパーサが最初のレベルのタグが開始タグを読み取ったときに終了する場所を推測できる方法を考えることはできません。

それで、いずれにしても、パーサーはすべてのノードを積み重ねてファイル全体を読み取る必要があります。たぶんスタッキングは避けることができますが、それは実際にxml構造体自体を奪うことと比較して、ピーナッツのように思えます。だから、利益は巨大ではないでしょう。

1対多リレーションシップのデータベースと2つのテーブルを使用することを検討しましたか? これは、効率とアプリで扱うことができるデータ量を解決します。

よろしく、 ステファン

0

DOMを使用したくない場合は、深さの最初の観点から、XMLからドキュメントの独自のオブジェクトモデルを構築する必要があります。モデルを構築したら、幅優先セマンティクスを適用することができます。

メモリが気になる人は、オブジェクトモデルがメモリ上になければならないということは何もありません。パースしているときにSQLLiteデータベースに格納できます。これは、XMLを何度も解析するのを避け、アプリとの統合を向上させるのに役立ちます。

他の詳細はありませんが、それはすべて私があなたに伝えることです。

1

あなただけのトップレベルの要素(文書のルート要素内のもの)を取得したい場合は、私は現在の要素(複数可)のStackを維持することをお勧め。開始時にヒットしたら、要素名をスタックに押します。停止したら、スタックから要素名をポップします。スタック上に1つの要素がある場合は常に、最上位の要素があります。

関連する問題