C# 附加现有XML文件
我有一个现有的XML文件,我想在不改变格式的情况下附加它。现有文件如下所示:C# 附加现有XML文件,c#,xml,C#,Xml,我有一个现有的XML文件,我想在不改变格式的情况下附加它。现有文件如下所示: <Clients> <User username="farstucker"> <UserID>1</UserID> <DOB /> <FirstName>Steve</FirstName> <LastName>Lawrence</LastName> <Locati
<Clients>
<User username="farstucker">
<UserID>1</UserID>
<DOB />
<FirstName>Steve</FirstName>
<LastName>Lawrence</LastName>
<Location>NYC</Location>
</User>
</Clients>
我曾考虑过使用XmlDocument片段来附加数据,但我不确定是否可以在不破坏文件的情况下维护现有格式(和空标记)
非常感谢您给我的任何建议
编辑我更改了代码以读取原始XML,但文件不断被覆盖。您应该使用XmlDocument类加载整个文件,在内存中修改它,然后写回内容以替换原始文件。别担心,它不会弄乱您的标记,您甚至可以使用
preservewitspace
属性()要求它在原始文档中保留不重要的空白 你可以试试这样的
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名称空间
如果您仍然有问题,请发回到这里,我们会帮助您解决。如果您想使用序列化(意味着您有一个数据对象要序列化为XML并附加到现有XML文件),您可以使用此通用方法
SerializeAppend
。它正是你所需要的。我还为任何可能受益的人添加了另外两种方法
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();
}
publicstaticvoid序列化(T对象,字符串路径)
{
var writer=新的XmlSerializer(typeof(T));
使用(var文件=新StreamWriter(路径))
{
序列化(文件,obj);
}
}
公共静态T反序列化(字符串路径)
{
var reader=新的XmlSerializer(typeof(T));
使用(变量流=新的流读取器(路径))
{
返回(T)读取器。反序列化(流);
}
}
公共静态void序列化附加(T对象,字符串路径)
{
var writer=新的XmlSerializer(typeof(T));
FileStream file=file.Open(路径,FileMode.Append,FileAccess.Write);
序列化(文件,obj);
file.Close();
}
我同意kicsit所说的,除了他说的“XmlDocument”部分之外,您希望使用XDocument和Linq to XML,因为它更友好、更易于使用。有一种从文件读取文档的静态加载方法和一种等效的保存方法。我相信大多数问题并没有说明他们使用的是.NET的哪个版本。LINQ在2.0或以前的版本中不存在。请不要使用新的XmlTextWriter()
。自.NET2.0以来,它一直被弃用。改为使用XmlWriter.Create()
。这样,它将再次附加相同的命名空间。。它不会附加到最后一个子节点,但只会附加到文档末尾
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();
}