2011-08-02 31 views
0

我一直在使用XmlPullParser從本地存儲的xml文檔生成android應用程序上的表單。如何讓XmlPullParser返回頂級元素的列表?

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

然後我有while循環處理樹中的所有元素。但是,因爲我一直使用

eventType = xpp.next(); 

這是一個深度優先方法時,其實我想做事(用戶向下鑽取樹通過問問題)的廣度優先的方法。大多數xml教程都依賴於DOM,因爲內存限制,我聽說在Android上不可靠。我會非常感激的幫助。

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算法會直觀地更有效地獲得第一級節點。但是,這似乎是一種非常「人性化」的方法。我無法想象xml解析器能夠在讀取開始標記時猜測第一級標記結束的位置。

因此,無論如何,您的解析器將不得不讀取整個文件,堆疊所有節點。也許可以避免堆疊,但它看起來像一個花生,而實際上是對XML結構本身進行rading。所以收益不會很大。

你有沒有考慮使用一個數據庫和兩個表的一對多關係?它會解決你的應用程序能夠處理的效率和數據量。

問候, 斯特凡

0

如果你不想使用DOM,那麼你將需要從深度優先的角度來建立你自己的XML文檔對象模型。在建立模型之後,您可以應用廣度優先的語義。

如果您關心內存,沒有什麼說您的對象模型必須位於內存中......您可以在解析它時將它存儲在SQLLite數據庫中。這可以幫助您避免多次解析XML並更好地與應用程序集成。

沒有任何其他細節,這是關於我可以告訴你的一切。

1

如果你想只得到頂層元素(文檔根元素內的),那麼我會建議保持當前元素(一個或多個)的Stack。當你開始時,將元素名稱推入堆棧。當你停下來時,從堆棧中彈出元素名稱。只要你在棧上有一個元素,你就有了一個頂層元素。