Class를 Xml 파일로 바꾸기
출처 : http://stackoverflow.com/questions/8334527/c-sharp-save-listt-to-xml-file
attribue 변경
출처 : https://msdn.microsoft.com/en-us/library/2baksw0z(v=vs.110).aspx
새로 클래스 만들었을 때는 빈 생성자가 있어야 한다.
출처 : http://egloos.zum.com/openyou/v/2512297
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace ClassDataWriteToXMLfile
{
public class BookList
{
[XmlArray("ExtensionList"), XmlArrayItem(typeof(String), ElementName = "Extension")]
public List<string> ExtensionList;
private List<Book> _list;
public BookList() { }
public BookList(List<Book> bList)
{
this._list = bList;
}
public List<Book> List
{
get { return _list; }
set { _list = value; }
}
public void ListWrite()
{
foreach (Book b in _list)
{
Console.WriteLine(string.Format("가격 : {0}, 내용 : {1}, 총페이지 : {2}", b.amount, b.text, b.totalPage));
}
}
}
public class Book
{
[XmlIgnore]
public string totalPage { get; set; }
[XmlElement("totalPage")]
public System.Xml.XmlCDataSection totalPageCData
{
get { return new System.Xml.XmlDocument().CreateCDataSection(totalPage); }
set { totalPage = value.Value; }
}
[XmlIgnore]
public string text { get; set; }
[XmlElement("text")]
public System.Xml.XmlCDataSection textCData
{
get { return new System.Xml.XmlDocument().CreateCDataSection(text); }
set { text = value.Value; }
}
public int amount { get; set; }
public Book() { }
public Book(int amount)
{
this.amount = amount;
}
public Book(int amount, string totalpage)
{
this.amount = amount;
this.totalPage = totalpage;
}
public Book(int amount, string totalpage, string text)
{
this.amount = amount;
this.totalPage = totalpage;
this.text = text;
}
}
class Program
{
static void Main(string[] args)
{
string str = string.Empty;
try
{
int[] a = { 5, 6, 7, 8 };
int[] p = { 12, 13, 11, 15 };
List<Book> list = new List<Book>();
for (int i = 0; i < a.Length; i++)
{
list.Add(new Book(p[i], a[i].ToString(), i.ToString()));
}
BookList bList = new BookList(list);
//리스트를 가진 클래스를 따로 만들어 보내거나
str = XMLSerializer.ToXML<BookList>(bList);
//List<T>를 그냥 보내거나
str = XMLSerializer.ToXML<List<Book>>(list);
Console.WriteLine(str);
//파일로 내려주기
string path = Environment.CurrentDirectory + "//test.xml";
XMLSerializer.ToXMLFile<BookList>(bList, path);
//내려준 파일 읽기
Console.WriteLine("여기서부터는 XML 파일을 읽어서 객체로 만든 다음 다시 출력하는 것으로");
BookList blst = XMLSerializer.FromXMLFile<BookList>(path);
blst.ListWrite();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
Console.Read();
}
}
}
public static class XMLSerializer
{
public static T FromXML<T>(string xml)
{
using (StringReader sr = new StringReader(xml))
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
return (T)serializer.Deserialize(sr);
}
}
public static T FromXMLFile<T>(string path)
{
string xml = string.Empty;
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
{
using (StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default))
{
sr.BaseStream.Seek(0, SeekOrigin.Begin);
while (sr.Peek() > -1)
{
xml = sr.ReadToEnd();
}
}
}
using (StringReader sr = new StringReader(xml))
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
return (T)serializer.Deserialize(sr);
}
}
public static string ToXML<T>(T obj)
{
using (StringWriter sw = new StringWriter(new StringBuilder()))
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
xmlSerializer.Serialize(sw, obj);
return sw.ToString();
}
}
public static void ToXMLFile<T>(T obj, string path)
{
using (StringWriter strw = new StringWriter(new StringBuilder()))
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
xmlSerializer.Serialize(strw, obj);
string strXML = strw.ToString();
using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write))
{
using (StreamWriter sw = new StreamWriter(fs))
{
sw.WriteLine(strXML);
}
}
}
}
}
}