2010-04-15 58 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