출처 : 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);

                    }

                }

            }

        }

    }

}

 

Posted by motolies
,