2011-03-21 69 views
2

我有可能會包含看起來像下面的空節點的XML文檔:編輯XML文件,並保留空格和製表符

<metadata territory="USA"></metadata> 

簡單地打開,然後使用XmlDocument的保存後,這一行看起來像:

<metadata territory="USA"> 
    </metadata> 

當我將PreserveWhitespace設置爲true時,它將整個XML轉換爲1行,所以這不起作用。

這些XML文件需要儘可能保持當前的格式。我知道,從技術上講,它們寫入的方式並不重要,它們將以相同的方式讀取,但我仍然需要保持相同的格式。我找不到一種方法來保持節點沒有值爲1行。有沒有辦法做到這一點?

保持原始格式的文檔的唯一方法是,如果XML文件包含「xml:space =」在標題中保留「',但我要離開標題。

我想改變的唯一事情就是增加值。正如我所說的,只是加載和保存文檔增加了這一點,所以如果你想測試,只是嘗試...

XmlDocument doc = new XmlDocument(); 
doc.Load(@"C:\Temp\test.xml"); 
doc.Save(@"C:\Temp\test_02.xml"); 
+0

僅供參考,這是沒有必要把 「C#」 的稱號 - 這就是標籤是。 – 2011-03-21 18:56:41

+0

你想解決什麼問題?你爲什麼關心格式? – 2011-03-21 18:58:35

+0

這是我在這裏的第一篇文章,所以我沒有意識到我不需要標題中的「C#」,直到太晚。我關心格式的原因是因爲這是一個我最初沒有創建的工作文件,當我們發送資源時,格式需要與創建時相同。 – Marvin 2011-03-22 06:07:47

回答

-1

爲什麼不將文件保存爲不同的格式,那麼它的後其重命名爲XML被保存。如果它的格式不正確,我會感到驚訝。不漂亮,但很容易。

0

我不認爲這是可能的。加載XML文檔時,會丟失格式化信息;所以Save無法給出相同的結果。

1

我與Richard Schneider:我不相信這是可能的。一種可能的解決方案是獲取輸出的XML文件,並通過XML格式化程序運行它,以規範化XML文件的格式(如果找不到,可以使用非託管XML dom編寫一個XML文件)。

由於該文件總是正常化,它不會有太大的改變。

+0

+1永不放棄 – BinaryTox1n 2011-03-21 01:08:06

+0

這是令人沮喪的考慮XmlDocument在其他方面的優秀程度。我會一直搞亂它,看看我能不能拿出一些東西。不幸的是,它可能不是一個'乾淨的'解決方案...... – Marvin 2011-03-21 15:17:44

+0

據我所知,根本問題是XmlDocument是可變的 - 你可以很容易地修改解析樹的方式,導致源文件和解析樹之間的關係無法辨認。所以XML DOM拋棄瞭解析狀態。 – 2011-03-21 18:53:24

7

只是做了測試,並通過設置PreserveWhitespace屬性同時使用XDocumentXmlDocument

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.PreserveWhitespace = true; 
xmlDoc.Load("test.xml"); 
xmlDoc.Save("testOut.xml"); 
.. 
XDocument xdoc = XDocument.Load("test.xml", LoadOptions.PreserveWhitespace); 
xdoc.Save(@"testOut.xml"); 

輸入:

<foo> 
    <metadata territory="USA"></metadata> 
    <bar></bar> 
    <baz> 
    </baz> 
</foo> 

輸出:

<foo> 
    <metadata territory="USA"></metadata> 
    <bar></bar> 
    <baz> 
    </baz> 
</foo> 
+0

正如我所說,我已經嘗試了這一點,不幸的是,它不起作用。當我創建自己的測試XML時,它可以工作,但是在我沒有創建的其他測試中,它將所有內容放在一行上。 – Marvin 2011-03-21 15:00:39

+0

@Marvin您可能想要檢查測試文檔和實際文檔之間編碼和非打印字符的差異。如果你可以規範什麼導致實際失敗的測試方式,這可能是一個解決方案。表面上,人們並不關心他們看不到的東西是不同的...... – Shibumi 2011-03-21 20:06:28

0

如果您使用XmlDocument的,我可能會建議你使用的XDocument代替(框架3.0+)。

PreserveWhitespace將增加

<whatever> <...> 
**</whatever>** 

在每一行,而沒有人會直接關閉它像< ... />。

我擡頭看了5分鐘,如何保留這些空白處,但找不到它。在de/reserialization中有一些省略字符(13)。

XDocument doc; 
using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read)) 
{ 
    //Alternative with .None 
    doc = XDocument.Load(fs, LoadOptions.PreserveWhitespace); 
} 

和重要的..

xmlDoc.Save("lala.xml", SaveOptions.None);