2012-10-28 50 views
5

我需要解析服務器上的一個巨大的xml文件並將其發送給客戶端。
我想按需解析 - 這意味着,首先解析並顯示父節點,以及客戶端何時單擊父節點 - 向服務器發送一個請求,告訴哪個父節點被選中,然後解析和發送它的孩子(再次,不是整個子樹,而是父母)。
我想過使用STAX解析器,但我不明白如何處理它,當談到父母與子女的關係。我如何告訴解析器不要繼續下一個作爲孩子的START-ELEMENT,而是跳到它的下一個父級?還有 - 還有一種方法可以回溯ITERATOR的實施嗎?在選擇一位家長並看到其子女之後,我可以回去看看以前的家長嗎?
我真的很感激任何建議!
謝謝。Stax解析 - 根據選擇的父解析子節點

+0

我需要完全simillar才能得到一些parrent的分支。然而,這可以通過Dom解析器 –

回答

3
  1. 不,您不能先跳過XML文檔的子樹而不先解析它。每個解析器都是如此,而不僅僅是StAX。 (瞭解這點跳到意味着你已經在解析之間的元素。)

  2. 但是通過保持你與每一個開始元素事件和減量與每一個結束元素事件增加一個嵌套級別計數器,很容易忽略來自目標級別以下級別的所有事件。

  3. 解析是一種方式,而不是隨機訪問,你不能來回跳轉。 (同樣,這會假設解析器存儲了迄今爲止已解析的所有內容的表示,這正是StAX的創建目的,以避免出現這種情況。)但是,當然,您可以嘗試記錄文件中每個父標記的字節位置,然後稍後尋求它,如果你有文件打開隨機訪問。儘管這種方法存在不少缺陷。

總而言之,您的用例看起來不太適合StAX。你有沒有試過VTD-XML?取決於文件的大小,它可能正是你想要的。

+0

完成感謝您的詳細解答!我有幾個問題,但:1)我可以搜索下一個父母(兄弟姐妹)沒有解析的子樹,但只是讀它 - 沒有做一個完整的解析?或者遍歷子樹=解析它? 2)我不確定是否需要隨機訪問。我想每次都顯示一個特定的級別。點擊節點時 - 顯示其第一級別的孩子。這裏需要隨機訪問嗎?我需要X-Path嗎?如果我這樣做 - 我可以將它與STAX結合嗎?或者我更好地尋找其他解析器? 3)對於1GB的文件,VTD-XML是否有用?因爲這就是我所得到的... – user1579191

+0

1.是的,我考慮過解析一個子樹。當然,你不需要記錄關於這些節點的任何信息(除了我提到的深度計數器,它是一個單一的全局'int')。 2.這是有效的隨機訪問,因爲每次用戶點擊某個節點時,都必須從其他位置開始處理。據我所知,是的。但是我沒有參與這個項目,我從來沒有嘗試過在大的文件上使用它。 – biziclop

+0

謝謝!最後一個問題(我希望......):我想知道我是否理解得很好:在Stax中 - 每次點擊節點時都需要花費大量時間來解析所有數據,但另一方面, t使用大量內存(它不保存任何數據,這意味着如果我解析一個小文件或一個大文件,這並不重要?)。在VTD-XML上 - 它使用了大量的內存(至少在我的情況下是很多的) - 但是隻有當點擊第一個節點(當它進行第一次和唯一一次的解析時)纔會很慢 - 之後會很快。對?再次感謝,你真的幫助我! – user1579191