2013-08-16 161 views
3

我想使用XML來存儲一些數據。但是當我想要獲取插入的最後一個數據時,我不希望讀取完整文件,也不希望在那裏添加新數據時重寫完整文件。 java中有沒有一種標準的方式來解析XML文件,而不是從開始,但從結束。例如,SAX或StaX解析器將首先遇到最後一個結束根標記並且最後一個標記。或者,如果我想這樣做,我應該閱讀和書寫所有東西,比如我正在閱讀/編寫常規文本文件?從文件末尾解析XML文件

+0

難道你只是添加新的數據到文件的前面? XML不是最好的格式,但是結構相當平坦,有些玩偏移你可以達到你想要的。只是想指出你定義了語義,也就是說,如果最新的入口在數據結構中是第一個或最後一個入住 – Matthias

+0

如果我將在文件前面添加新數據,那麼我將重寫整個文件以保存它。讀取操作是好的,但寫入等於創建新的同一個文件。 – trims

回答

3

從根本上說,XML是一個糟糕的代表選擇。這種格式本質上就是這樣「包含」的,我還沒有看到任何鼓勵你去反對的API。

選項:

  • 選擇不同的格式完全(例如使用一個數據庫)
  • 創造了大量的小XML文件,而不是 - 每一個自成一體。當你想要整個數據時,讀取所有文件
  • 只需吞下命中並且每次讀/寫整個文件。
+0

您如何看待,創建大量xml文件並將它們全部放入一個zip文件會有效嗎?我能否從zip壓縮包中讀取單獨的文件,而無需解壓縮整個zip文件,但只需要一個我需要的文件? – trims

+0

@trims:是的,那對於閱讀來說是相當高效的(假設一個體面的zip實現) - 但是你不希望每次添加新條目時都要重新壓縮zip文件。 –

0

爲什麼不使用sax/stax,只處理最後一個條目?是的,它需要打開並瀏覽整個文件,但至少相當有效,而不是加載整個DOM樹。

不這樣做,我不認爲你可以做你要求使用XML作爲來源。

除了Jon Skeet在他的回答中提供的另一種替代將保持相同的格式,但首先插入最新的條目,並在您讀完條目後立即停止處理文件。

+0

如果文件大於閱讀整個發現找到最新的行將是非常低效的。是的,它比在內存中加載整個文件要好得多,但對於只有一行代碼來說仍然效率很低。 我相信另一種選擇效率更低,因爲當在文件的開頭插入某些內容時,我將不得不重寫整個文件。 也許xml不是我想要的最佳格式。 – trims

+0

@trims:可能不是。你也可以考慮實現你自己的XML解析器並使用內存映射文件,但這對你來說意味着很多麻煩。我猜如果你不需要任何類型的模式驗證,並且你的格式已經很好解決了,這可能是一個解決方案,但它有點再次指出,XML不是你想要的。 – haylem

1

我在這方面找到了一個很好的主題,並提供了我想要的示例解決方案。 此鏈接:http://www.oreillynet.com/xml/blog/2007/03/parsing_xml_backwards.html 似乎XML是不是很好的文件格式來實現我想要的。沒有標準的解析器可以從頭到尾解析XML,而不是從頭開始。

可能最好的解決方案是將所有的XML數據存儲在一個文件中,其中包含許多XML文件內容的組成。在每行存儲XML的單獨內容。該文件本身不是格式良好的XML,但每行都包含格式良好的xml,我將使用標準xml解析器(StaX)進行解析。

這樣我就可以從文件的末尾讀取僅僅線條,並將新數據附加到文件末尾。當我需要整個數據或只有部分數據時,我會讀取所有行或其中的一部分。也許我也可以從文件末尾實現分頁,因爲文件可能很大。

爲什麼每行中都有XML?我認爲使用API​​來解析它很容易,以及將數據存儲在xml中是人類可讀的,而不是用一些符號來分隔行中的值。