2010-05-09 134 views
2

此片段<!--Please don't delete this-->是我的xml文件的一部分。運行此方法後,生成的xml文件不再包含此片段<!--Please don't delete this-->。爲什麼是這樣?處理XML文件會刪除註釋

這裏是我的方法:

  XmlSerializer serializer = new XmlSerializer(typeof(Settings)); 
     TextWriter writer = new StreamWriter(path); 
     serializer.Serialize(writer, settings); 
     writer.Close();  
+0

任何特定語言? XML庫? – 2010-05-09 08:37:12

回答

1

<!-- -->標誌着XML註釋。您正在將對象寫入XML - 對象在編譯期間編譯時沒有註釋。

也就是說,Settings對象(可能是.config XML的反序列化形式)在解序列化後並不在內存中保存註釋,所以它們也不會被序列化。由於沒有內置的機制可以使用XmlSerializer反序列化註釋,因此對框架的這種行爲沒有任何可以做的事情。

+0

任何其他方式,我可以保存這些意見? – little 2010-05-09 08:44:04

+0

這取決於你想要做什麼 - 如果你只是想複製文件,你可以使用@marc_s建議的方法。如果您需要更新設置,則需要編寫一些自定義的XML解析代碼,以保留註釋。 – Oded 2010-05-09 08:48:31

+0

我需要先更新xml。 – little 2010-05-09 09:20:23

4

好了,這是很明顯的:

  • XmlSerializer將解析XML文件,並從中提取的Settings所有實例 - 您的評論將不會是任何對象的一部分
  • 當你再出來寫那些回,只有Settings對象的內容寫出來再次

您的評論會漏掉 - 但我看不出有什麼辦法可以「拯救」這一評論,只要你「重新使用XmlSerializer方法。

你需要做的是使用的XmlReader/XmlWriter的,而不是:

XmlReader reader = XmlReader.Create("yourfile.xml"); 
XmlWriter writer = XmlWriter.Create("your-new-file.xml"); 

while (reader.Read()) 
{ 
    writer.WriteNode(reader, true); 
} 

writer.Close(); 
reader.Close(); 

這將複製所有XML節點 - 包括註釋 - 到新的文件。

+0

他會如何保留註釋並使用此方法更新設置的更改? – Oded 2010-05-09 08:49:34

+0

我使用了上面的代碼,並且沒有對xml文件進行更改。 – little 2010-05-09 09:25:52

+0

@deader,@little:好吧,如果你想在從原始文件讀取的時候修改東西,你需要在讀取它們時解析XML節點。在調用reader.Read()之後,您可以訪問底層XML節點 - 您可以用任何方式修改它,形狀或形式。 – 2010-05-09 10:04:21