附加现有XML文件

时间:2010-04-15 13:04:14

标签: c# 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 Fragment附加数据,但我不确定我是否可以维护现有格式(和空标记)而不会弄乱文件。

非常感谢您给予的任何建议。

编辑我已经将代码更改为读取原始XML,但文件仍然被覆盖。

3 个答案:

答案 0 :(得分:4)

您应该使用XmlDocument类加载整个文件,在内存中修改它,然后将内容写回来替换原始文件。不用担心,它不会弄乱你的标记,你甚至可以要求它使用PreserveWhitespace属性(http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.preservewhitespace.aspx)保留原始文档中的非重要空格。

答案 1 :(得分: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命名空间。

如果您仍然遇到问题,请回复此处,并帮助您完成它。

答案 2 :(得分: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();
}