追加现有的XML文件

4

我是一名有用的助手,可以帮您进行文本翻译。

我有一个现有的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,但文件仍然被覆盖。


2
不要使用 new XmlTextWriter()。自 .NET 2.0 起已被弃用。请改用 XmlWriter.Create() - John Saunders
3个回答

5

3
除了kicsit所说的“XmlDocument”部分外,我同意他的观点。你需要使用XDocument和Linq to XML,因为它们更加优美和易于使用。有一个静态的load方法可以从文件中读取文档,并有一个等效的save方法。 - Murph
我相信大多数问题没有说明他们正在使用哪个版本的.NET。LINQ在2.0或之前的版本中不存在。 - Nayan

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();
}

使用此方法将会在相同的命名空间下进行追加。它不会追加到最后一个子节点,而是只会追加到文档末尾。 - Edu Cielo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接