2011-10-13 101 views
4

假設我有以下XML文件:在原地修改XML文件?

<book> 
<name>sometext</name> 
<name>sometext</name> 
<name>sometext</name> 
<name>Dometext</name> 
<name>sometext</name> 
</book> 

如果我想修改通過改變d在S上的內容(如圖中第四個「名」節點),而不必讀取/寫入整個文件,這可能嗎?

+1

所有的編輯都是長度保留的嗎? –

+0

@Henk不能得到什麼ü由平均長度保留這裏:( – Abhi

+0

你的示例替換1個字符與其他1個字符型,這是可行的。但是修改'Dometext'成'SomeString'是一個完全不同的問題。 –

回答

3

一個10 MB的文件不是問題。啜泣。修改DOM。將其寫回文件系統。 10 GB是更大的問題。在這種情況下:

假設:您沒有更改文件的長度。把文件看作是一個字符數組而不是一個(鏈接的)字符列表:你不能在中間添加字符,只能改變它們。

你需要seek在文件中的位置改變,然後write那個字符到磁盤。

在.NET世界中,使用FileStream對象,您可以將Position屬性設置爲D字符的索引,然後編寫單個s字符。 Check out this question on random access of text files

也讀這個問題:How to insert characters to a file using C#。它看起來像你不能真正使用FileStream對象,而是不得不求助於寫入單個字節。

祝你好運。但是,真的,如果我們只談了10 MB,那麼就把它搞糊塗了。電腦應該在做你的工作。

1

最乾淨(和最好)的方法是使用XmlDocument對象來操作,而是一個快速和骯髒的解決方法就是讀取XML的字符串,然後:

xmlText = xmlText.Replace("Dometext", "sometext"); 
+0

如何使用XmlDocument對象進行操作,所以通過這個我們不需要重寫整個文件:),b ecause我的XML文件的大小超過10 MB,我不希望把它改寫只是由於單個字符:) – Abhi

+1

的變化「而無需讀/寫整個文件」。當你閱讀它時,你可能會把它加載到XDocument中。 –

+0

@Abhishek古普塔1)只要做到這一點「的簡單方法」 2)基準它3)#2分別表示它的速度太慢(需要有確定的功能要求;-),做「辛苦」 - 程序員的時間對於現代計算機來說,10MB也不算什麼(通常)。 – 2011-10-13 08:31:33

1

XML文件是一個文本文件,不允許插入/刪除。唯一支持的突變是OverWrite和Append。與XML不太匹配。

所以,首先要確定你確實需要這個。這是一個複雜的操作,只有在非常大的文件上才值得。

由於長度可能會發生變化,您至少需要將之後的所有內容移動到後的第一個替換。多次替換的可能性意味着您可能需要一個很大的緩衝區來適應這些變化。

複製整個文件比較容易。這在I/O中很昂貴,但是可以節省內存使用。

2

我只是在文件中讀取進程,然後吐出來。

這可以通過XmlReader以流式傳輸方式完成 - 它比XmlDocument或XDocument更爲人工,但它確實避免了創建內存中的DOM(XmlDocument/XDocument可用於相同的讀/寫模式,但通常需要在內存中的全重構):

  1. 打開文件輸入文件流(的XmlReader)
  2. 打開輸出文件流(的XmlWriter,到不同的文件)從的XmlReader讀取及寫入
  3. 到XmlWriter執行任何反式必要的組成部分。
  4. 關閉流
  5. 將新文件到舊文件(覆蓋,原子動作)

雖然這可以被設置來處理同一個打開的文件輸入和輸出一堆真巧妙的工作什麼都不會被保存,並且有許多邊緣情況,包括增加減少文件長度。事實上,它可能會比較慢嘗試只是轉移文件的內容向後填補空白或向前移動的文件內容,使新的空間。除了最基本的長度保留操作之外,文件系統緩存可能會使任何「增益」最小/最小化。此外,在地方修改一個文件是不是一個原子操作,通常是在一個錯誤的情況下不可恢復:在臨時文件的費用,讀/寫/移動的方法是原子WRT最終的文件內容。

或者,考慮XSLT - 它是專爲這個;-)

編碼愉快。