2014-02-17 72 views
1

所以,我一直在尋找,但無法找到答案。德爾福的FormatXMLData導致EOutOfMemory

關於創建大型XML導致此內存不足異常的SOF存在一個問題,但這不是我的情況。

我正在通過XML數據綁定使用IXMLDocument創建一個XML,並且它創建得很好。

但是,將它保存到文件時,它都在一行文本中。 要走的路是在將XML保存到文件之前通過FormatXMLData傳遞XML。

這對小文件很好用,但如果XML足夠大,則會與EOutOfMemory一起崩潰。

所以我嘗試添加選項[doNodeAutoIndent],但也沒有工作。

下一步,我創建了一個TStringList來接收XML,所以我可以停用IXMLDocument,然後嘗試TSringList上的FormatXMLData。我對此並不期待,但我想這兩個組件可能會使用不同的內存管理器(我錯誤地認爲IXMLDocument使用的是COM內存管理器而不是Delphi的),現實情況已經非常接近預期,因爲同樣的例外被提出。

任何人有一個想法,如何使用XML數據綁定,使用FormatXMLData或任何其他選項時,我的XML保存正確縮進和格式化?

在StackOverFlow上閱讀類似的問題,我看到了一些替代方案,其中包括一個SAX解析器來替換基於IXMLDocument的DOM,但我相信會禁用XML數據綁定的優勢,是不是?

謝謝 努諾

+0

未格式化的XML文檔有多大? – whosrdaddy

+0

我正在測試一個8.5 MB的XML信息量,但有時甚至會更大...... – nunopicado

回答

1

你不必,只要用SAX解析器來替代DOM解析器SAX解析器可以處理DOM樹字符串作爲輸入流。

您也可以實現您自己的基於流的格式化程序,該程序只需基於打開/關閉字符串中的XML元素標記縮進/取消縮進字符串。這將很快並且易於實施。

+0

嗨mjn。謝謝你的回覆。 因此,你建議我使用帶有XML數據綁定的DOM解析器創建XML,然後將XML字符串傳遞給SAX解析器或自定義壓頭,只是爲了格式化XML,是嗎? 這是一個想法......你知道任何你可以推薦的SAX解析器(用於XE3)嗎?我想檢查該選項... – nunopicado

+1

@nunopicado SAX與德爾福,請參閱http://stackoverflow.com/q/3581520/80901 – mjn