2016-11-10 41 views
2

修改XML文件是可能的。但是,我想了解的是 -
- >是否有可能使用StAX更新XML文檔,當它遇到的事件。如果這樣做的話,那麼就不會有很大的內存佔用。
示例 - 如果我正在閱讀Customers.xml文件,我需要將每個客戶的狀態信息從StateName更改爲StateCode。然後,當我遇到內容 -
<State>California</State>我想將其更改爲<State>CA</State>如何StAX的處理XML的修改使用StAX

所以使用StAX也可以這樣修改源文件立即讀取<State>California</State>後發生,僅只有經過解析器下一個客戶向前走記錄。 因此,當讀取第二個客戶記錄時,第一個客戶狀態已經在xml中更新爲狀態碼。


- >做它暫時保持跟蹤要做出的改變處理更新和解析整個文檔後更新單個去整個文檔。在這種情況下,我會猜測如果大文檔(比如10GB XML文件)發生太多變化,將會有巨大的內存佔用。
示例續 - 因此,當處理第二個客戶時,StAX知道第一個客戶的狀態字段需要更新,但它會將其延遲,直到讀取所有客戶記錄。它可以使用一些內存機制來跟蹤需要更新到XML的內容。

+2

請clarifiy你的第一句話。顯示一些示例代碼。你的意思是就地改變了嗎?我相信這是StAX無法實現的。 – vanje

+0

@vanje,我不是在StAX中編程,而是在評估它爲我的團隊使用它來讀取和修改大型xml文件(1GB +)。但我絕對可以澄清這個問題。我正在編輯問題以使其更清楚。 – RedwinD

+0

for!GB +文件大小,VTD-XML的增量更新功能是您可能想要考慮的東西...對於10GB +文件,stax可悲是您唯一的選擇...... –

回答

1

不能使用StAX更改的XML文件原地的,但你可以讀取文件,寫入到另一個文件,並應用在即時變更。修改後的StAX事件(包括更改)會立即寫入目標文件(內部緩衝目的除外)。

所以你的XML文件的大小或更改的數量並不重要。

如果所做的更改在XML依賴於其他地區則變得更加困難。然後您可以兩次處理XML文件。通過1用於收集所有必要的更改信息,通過2用於將更改與通過1收集的信息一起應用。 或者,您可以使用完全不同的方法,如XML數據庫(例如BaseX),並將更改與XQuery一起應用。