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