2010-04-05 52 views
1

我正在用Android中的SAX解析器解析一個非常簡單的XML模式。中止SAX解析中間文檔?

一個例子文件將是

<Lists> 
<List name="foo"> 
<Note title="note 1" .../> 
<Note title="note 2" .../> 
</List> 
<List name="bar"> 
<Note title="note 3" .../> 
</List> 
</Lists> 

的......代表着音符數據是,不屬於重要質疑屬性。

我使用SAX解析器來解析文檔,並僅實現startElement和HandlerBase的'endElement'方法來處理Note和List節點。

但是,在某些情況下,文件可能非常大,需要一些時間來處理。我希望能夠隨時中止解析過程(即用戶按取消按鈕)。

我想出的最好辦法是在滿足特定條件時(即boolean stopParsing爲真),從我的startElement方法拋出異常。

有沒有更好的方法來做到這一點?

我一直使用DOM風格的解析器,所以我不完全理解SAX解析器。

最後一點需要注意的是,我在Android上運行這個工具,因此我將在工作線程上運行Parser以保持UI的響應。如果你知道如何在分析器運行時安全地殺死線程,那麼也可以回答我的問題。

回答

2

您可能想要查看XMLPullParser,因爲只需調用下一個方法即可輕鬆執行此操作。您對解析有更多的控制。

XmlPullParser xpp=getResources().getXml(R.xml.lists); 
while (xpp.getEventType()!=XmlPullParser.END_DOCUMENT) { 
    if (xpp.getEventType()==XmlPullParser.START_TAG) { 
     if (xpp.getName().equals("list")) { 
      items.add(xpp.getAttributeValue(0)); 
     } 
    } 

    xpp.next(); 
} 
+0

看起來不錯。我現在唯一需要弄清楚的是如何在工作線程中停止它。 – CodeFusionMobile 2010-04-05 19:32:50

+0

事件更好,請嘗試使用Stax(javax.xml.stream),因爲它是標準的pull解析器API,並且impl包含在JDK 1.6中(或者可以在外部使用Woodstox) – StaxMan 2011-11-06 18:38:35