2010-04-15 57 views
3

我有一個現有的XML文件,我想追加而不更改格式。現有文件如下所示:附加現有的XML文件

<Clients> 
    <User username="farstucker"> 
    <UserID>1</UserID> 
    <DOB /> 
    <FirstName>Steve</FirstName> 
    <LastName>Lawrence</LastName> 
    <Location>NYC</Location> 
    </User> 
</Clients> 

如何添加使用此格式的其他用戶?我現有的代碼是:

 string fileLocation = "clients.xml"; 

     XmlTextWriter writer; 

     if (!File.Exists(fileLocation)) 
     { 
      writer = new XmlTextWriter(fileLocation, null); 
      writer.WriteStartDocument(); 

      // Write the Root Element 
      writer.WriteStartElement("Clients"); 

      // End Element and Close 
      writer.WriteEndElement(); 
      writer.Close(); 
     } 
// Append new data here 

伊夫想過使用XmlDocument的片段數據,但我不是某些追加,如果我能保持不搞亂該文件的現有格式(空標籤)。

任何意見,你可以給予非常感謝。

編輯我改變了代碼來讀取原始的XML,但文件不斷被覆蓋。

+2

不要使用'new XmlTextWriter()'。自.NET 2.0以來,這已被棄用。改爲使用'XmlWriter.Create()'。 – 2010-04-16 03:45:42

回答

4

您應該使用XmlDocument類加載整個文件,在內存中修改它,然後將內容寫回到替換原始文件的位置。不要擔心,它不會混淆您的標記,甚至可以要求它使用PreserveWhitespace屬性(http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.preservewhitespace.aspx)在原始文檔中保留不重要的空白。

+3

我同意kicsit所說的除了他所說的「XmlDocument」部分外,您希望將XDocument和Linq用於XML,因爲它顯着更好,更易於使用。有一種靜態加載方法可以從文件中讀取文檔並進行等效保存。 – Murph 2010-04-15 13:15:51

+0

我相信大部分問題都沒有說明他們使用的是什麼版本的.NET。 LINQ在2.0或以前的版本中不存在。 – Nayan 2010-04-15 13:20:58

+0

對不起,我使用3.5 – Ryan 2010-04-15 13:43:47

1

你可以嘗試這樣的事情......

 string fileLocation = "clients.xml"; 

     if (!File.Exists(fileLocation)) 
     { 
      XmlTextWriter writer = new XmlTextWriter(fileLocation, null); 
      writer.WriteStartElement("Clients"); 
      writer.WriteEndElement(); 
      writer.Close(); 
     } 

     // Load existing clients and add new 
     XElement xml = XElement.Load(fileLocation); 
      xml.Add(new XElement("User", 
      new XAttribute("username", loginName), 
      new XElement("DOB", dob), 
      new XElement("FirstName", firstName), 
      new XElement("LastName", lastName), 
      new XElement("Location", location))); 
     xml.Save(fileLocation); 

這應該讓你開始,剛剛替換不管你使用的是不要忘記添加System.Xml.Linq的命名空間的變量。

如果你仍然有問題發回這裏,並很好地幫助你通過它。

0

如果你想使用序列化(意味着你有一個數據對象想要序列化到XML並追加到現有的XML文件),你可以使用這種通用的方法SerializeAppend<T>。它完全符合你的需求。我還爲任何可能受益的人添加了兩種方法

public static void Serialize<T>(T obj, string path) 
{ 
    var writer = new XmlSerializer(typeof(T)); 

    using (var file = new StreamWriter(path)) 
    { 
     writer.Serialize(file, obj); 
    } 
} 


public static T Deserialize<T>(string path) 
{ 
    var reader = new XmlSerializer(typeof(T)); 
    using (var stream = new StreamReader(path)) 
    { 
     return (T)reader.Deserialize(stream); 
    } 

} 

public static void SerializeAppend<T>(T obj, string path) 
{ 
    var writer = new XmlSerializer(typeof(T)); 

    FileStream file = File.Open(path, FileMode.Append, FileAccess.Write); 

    writer.Serialize(file, obj); 

    file.Close(); 
} 
+0

與此它將再次附加相同的命名空間..它不會追加到最後一個子節點,但它只會追加到文檔結束 – 2015-05-19 01:23:08