C# 向Xml添加新对象

C# 向Xml添加新对象,c#,wpf,xml,xml-serialization,C#,Wpf,Xml,Xml Serialization,我有一个要存储在XML文档中的对象列表。我使用序列化/反序列化来存储和检索数据。当我必须存储新对象时,我将整个xml反序列化到一个列表中,并将新对象添加到此列表中,然后再次序列化以将其存储回xml 我的问题是,这是添加新对象的正确方法,还是有其他方法添加新对象,我不想手动创建标记并添加,因为它们在反序列化数据时可能会导致错误 这就是我现在正在使用的: public static T readXml<T>(string fileName) { T tempLi

我有一个要存储在XML文档中的对象列表。我使用序列化/反序列化来存储和检索数据。当我必须存储新对象时,我将整个xml反序列化到一个列表中,并将新对象添加到此列表中,然后再次序列化以将其存储回xml

我的问题是,这是添加新对象的正确方法,还是有其他方法添加新对象,我不想手动创建标记并添加,因为它们在反序列化数据时可能会导致错误

这就是我现在正在使用的:

 public static T readXml<T>(string fileName)
    {
        T tempList ;
        XmlSerializer deserializer = new XmlSerializer(typeof(T));
        TextReader textReader = new StreamReader(fileName);
        tempList = (T)deserializer.Deserialize(textReader);
        textReader.Close();

        return tempList;
     }

    public static void writeXml<T>(T tempList,string fileName)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(T));
        TextWriter textWriter = new StreamWriter(fileName);
        serializer.Serialize(textWriter, tempList);
        textWriter.Close();
    }
publicstatict-readXml(字符串文件名)
{
圣殿骑士;
XmlSerializer反序列化器=新的XmlSerializer(typeof(T));
TextReader TextReader=新的StreamReader(文件名);
templast=(T)反序列化程序;
textReader.Close();
返回圣殿骑士;
}
公共静态void writeXml(T templast,字符串文件名)
{
XmlSerializer serializer=新的XmlSerializer(typeof(T));
TextWriter TextWriter=新的StreamWriter(文件名);
serializer.Serialize(textWriter,tempList);
textWriter.Close();
}

本质上,是的,序列化是正确的选择。它是健壮的、相当灵活的,并且比“手动”写出对象少很多工作(并且更容易维护)

但是,如果您正在序列化的对象图很大,并且希望使进程更高效,那么您可能需要考虑是否可以仅序列化新对象,然后将其追加或插入到现有的XML中。 要插入或追加新节点,需要将现有xml加载到XmlDocument对象中,找到要添加新内容的节点,然后追加新节点。例如:

XmlDocument xmldoc = new XmlDocument();
xmldoc.Load("MyXml.xml");
XmlDocument newDoc = new XmlDocument();
newDoc.Load("MyNewObject.xml");

//Use Xpath to specify node
XmlNode insertNode = xmldoc.SelectSingleNode("parentElement/myElement");
XmlNode newObj = newDoc.SelectSingleNode("rootElement");

insertNode.AppendChild(newObj);

xmldoc.Save("MyXml.xml"); 

从文件中检索xml仅用于示例目的:在现实世界中,您可能已经在某种形式的流或xml读取器中拥有它,或者您可能需要从数据库中检索它。

是的,这就是我想学习的,我如何附加单个对象?