将List <T>保存到XML文件

ini*_*iki 12 c# xml

我想将从数据库中获取的记录保存在XML文件中,
将XML文件中的x个记录从一个自定义集合中List<T>
处理,然后将更新的项目保存回XML文件.

'T'是一个具有值类型属性的简单对象,类似于 -

public class T
{
   public int Id {get; set;}
   public string property1 {get; set;}
   public string property2 {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

请指导我如何将自定义集合保存List<T>到XML文件,反之亦然?

另外,因为我没有发送这个XML文件,所以在某些回复中建议使用XmlSerializer是否有意义?

小智 16

以下是我们使用XMLSerializer实现此目的的两种方法:

 public static T FromXML<T>(string xml)
 {
     using (StringReader stringReader = new StringReader(xml))
     {
        XmlSerializer serializer = new XmlSerializer(typeof(T));
        return (T)serializer.Deserialize(stringReader);
     }
 }

 public string ToXML<T>(T obj)
 {
    using (StringWriter stringWriter = new StringWriter(new StringBuilder()))
    {
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
        xmlSerializer.Serialize(stringWriter, obj);
        return stringWriter.ToString();
    }
 }
Run Code Online (Sandbox Code Playgroud)

  • 并且T的实例必须具有无参数构造函数. (2认同)

Bro*_*ass 14

虽然您可以使用序列化程序 - 很多时候这是正确的答案 - 我个人会使用Linq to XML,这将使您能够更灵活地了解XML的外观,即从foos基于以下内容的集合创建以下XML:你的班:

<Foos>
  <foo Id="1" property1="someprop1" property2="someprop2" />
  <foo Id="1" property1="another" property2="third" />
</Foos>
Run Code Online (Sandbox Code Playgroud)

你可以使用:

var xml = new XElement("Foos", foos.Select( x=> new XElement("foo", 
                                                new XAttribute("Id", x.Id), 
                                                new XAttribute("property1", x.property1), 
                                                new XAttribute("property2", x.property2))));
Run Code Online (Sandbox Code Playgroud)


小智 10

使用下面的代码(从您的代码片段中获取的T类),您将能够轻松地序列化到xml文件中,并且没有麻烦的ISerializable麻烦

[Serializable()]
public class T
{
    public int Id {get; set;}
    public string property1 {get; set;}
    public string property2 {get; set;}
}

...

List<T> data = new List<T>()

... // populate the list

//create the serialiser to create the xml
XmlSerializer serialiser = new XmlSerializer(typeof(List<T>));

// Create the TextWriter for the serialiser to use
TextWriter filestream = new StreamWriter(@"C:\output.xml");

//write to the file
serialiser.Serialize(filestream , data);

// Close the file
filestream.Close();
Run Code Online (Sandbox Code Playgroud)