Wanna be Brilliant Full-Stack Developer

C# WINFORMS XMLREADER, XMLWRITER 본문

Some Memos/C#

C# WINFORMS XMLREADER, XMLWRITER

Flashpacker 2023. 4. 24. 16:32

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;

namespace _17_XMLControl
{
    class CXMLControl
    {
        // Dictionary 및 XML의 항목을 정의 ( static(정적) 변수로 사용 : 프로그램 실행 시 메모리에 바로 할당
        public static string _TEXT_DATA = "TEXT_DATA";
        public static string _CBOX_DATA = "CBOX_DATA";
        public static string _NUMBER_DATA = "NUMBER_DATA";


        /// <summary>
        /// XML을 저장 하기 위해 사용
        /// </summary>
        /// <param name="strXMLPath">저장 할 XML File의 경로 및 파일명</param>
        /// <param name="DXMLConfig">XML로 저장 할 항목</param>
        public void fXML_Writer(string strXMLPath, Dictionary<string, string> DXMLConfig)
        {
            // using 범위 내에 XmlWriter를 정의 하여 using을 벗어 나게 될 경우 자동으로 Dispose 하여 메모리를 관리
            using (XmlWriter wr = XmlWriter.Create(strXMLPath))
            {
                // XML 형태의 Data를 작성 (결과 및 예제 확인)

                wr.WriteStartDocument();

                // Setting#01
                wr.WriteStartElement("SETTING");
                wr.WriteAttributeString("ID", "0001");  // attribute 쓰기

                wr.WriteElementString(_TEXT_DATA, DXMLConfig[_TEXT_DATA]);
                wr.WriteElementString(_CBOX_DATA, DXMLConfig[_CBOX_DATA]);
                wr.WriteElementString(_NUMBER_DATA, DXMLConfig[_NUMBER_DATA]);

                wr.WriteEndElement();
                wr.WriteEndDocument();
            }
        }


        /// <summary>
        /// XML을 읽어 오기 위해 사용
        /// </summary>
        /// <param name="strXMLPath">읽어 올 XML File의 경로 및 파일명</param>
        /// <returns></returns>
        public Dictionary<string, string> fXML_Reader(string strXMLPath)
        {
            Dictionary<string, string> DXMLConfig = new Dictionary<string, string>();  // 읽어 온 XML Data를 Dictionary에 저장하기 위해 선언 및 초기화

            // using 범위 내에 XmlReader를 정의 하여 using을 벗어 나게 될 경우 자동으로 Dispose 하여 메모리를 관리
            using (XmlReader rd = XmlReader.Create(strXMLPath))
            {
                // xml을 한줄 씩 읽으면서 필요 한 정보를 가져 옴
                while (rd.Read())
                {
                    if (rd.IsStartElement())
                    {
                        if (rd.Name.Equals("SETTING"))
                        {
                            string strID = rd["ID"];  // attribute 읽기   //여기 뭐지??  ID를 읽고 뭐하는거지??
                            rd.Read();  //다음 노드로 이동

                            string strTEXT = rd.ReadElementContentAsString(_TEXT_DATA, "");  // 키 값을 기준으로 결과 값을 가져 옴
                            DXMLConfig.Add(_TEXT_DATA, strTEXT);   // 키값과 가져온 결과 값을 Dictionary에 저장

                            string strCBOX = rd.ReadElementContentAsString(_CBOX_DATA, "");
                            DXMLConfig.Add(_CBOX_DATA, strCBOX);

                            string strNUMBER = rd.ReadElementContentAsString(_NUMBER_DATA, "");
                            DXMLConfig.Add(_NUMBER_DATA, strNUMBER);
                        }
                    }
                }
            }

            return DXMLConfig;   // 작성 한 Dictionary를 반환
        }
    }
}
using _17_XMLControl;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.Window;

namespace StreamReader_Write
{
    public partial class Form1 : Form
    {

        CXMLControl _xml = new CXMLControl();   // 만들어 놓은 CXMLControl을 사용하기 위해 선언 및 초기화 (기본 생성자)
        Dictionary<string, string> _dData = new Dictionary<string, string>();  // CXMLControl과 Data를 주고 받기 위해 Dictionary를 선언 및 초기화

        /// <summary>
        /// 진입점
        /// </summary>
        public Form1()
        {
            InitializeComponent();
        }


        /// <summary>
        /// GroupBox 안에 있는 Data를 화면에 보여주기 위한 상단 TextBox로 보냄
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnConfigSet_Click(object sender, EventArgs e)
        {
            string strEnter = "\r\n";

            string strText = tboxData.Text;
            bool bChecked = cboxData.Checked;
            int iNumber = (int)numData.Value;

            StringBuilder sb = new StringBuilder();


            _dData.Clear();  // 기존에 Dictionary에 Data가 남아 있을 수 있으므로 작성 하기 전 초기화 시킴

            // Dictionary에 UI에서 작성 한 항목과 값을 Key와 Value로 저장
            _dData.Add(CXMLControl._TEXT_DATA, strText);
            _dData.Add(CXMLControl._CBOX_DATA, bChecked.ToString());
            _dData.Add(CXMLControl._NUMBER_DATA, iNumber.ToString());


            sb.Append(strText + strEnter);
            sb.Append(bChecked.ToString() + strEnter);
            sb.Append(iNumber.ToString() + strEnter);

            tboxConfigData.Text = sb.ToString();
        }


        /// <summary>
        /// Main TextBox에 있는 문자를 텍스트 파일로 저장
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSave_Click(object sender, EventArgs e)
        {
            string strFilePath = string.Empty;

            SFDialog.InitialDirectory = Application.StartupPath;   //프로그램 실행 파일 위치
            SFDialog.FileName = "*.xml";
            SFDialog.Filter = "xml files (*.xml)|*.txt|All files (*.*)|*.*";

            if (SFDialog.ShowDialog() == DialogResult.OK)
            {
                strFilePath = SFDialog.FileName;

                //// StreamWriter를 이용해서 텍스트 파일을 일어노는 부분을 구현
                //StreamWriter swSFDialog = new StreamWriter(strFilePath);

                //swSFDialog.WriteLine(tboxConfigData.Text);
                //swSFDialog.Close();

                //File.WriteAllText(strFilePath, tboxConfigData.Text);

                _xml.fXML_Writer(strFilePath, _dData);   // 작성 한 CXMLControl에서 fXML_Writer를 호출해서 XML File을 생성
            }

        }


        /// <summary>
        /// 텍스트 파일을 읽어와서 Main TextBox에 보여 줌
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnLoad_Click(object sender, EventArgs e)
        {
            string strFilePath = string.Empty;

            OFDialog.InitialDirectory = Application.StartupPath;   //프로그램 실행 파일 위치
            OFDialog.FileName = "*.xml";
            OFDialog.Filter = "xml files (*.xml)|*.*";

            StringBuilder sb = new StringBuilder();

            if (OFDialog.ShowDialog() == DialogResult.OK)
            {
                strFilePath = OFDialog.FileName;

                //// StreamReader를 이용해서 텍스트 파일을 일어노는 부분을 구현
                //StreamReader srOFDialog = new StreamReader(strFilePath, Encoding.UTF8, true);

                //while (srOFDialog.EndOfStream == false)
                //{
                //    sb.Append(srOFDialog.ReadLine());
                //    sb.Append("\r\n");
                //}

                sb.Append(File.ReadAllText(strFilePath));  // 텍스트 파일을 String 형태로 한번에 읽어 옴

                //string[] dd =  File.ReadAllLines(strFilePath);   // 텍스트 파일을 한줄 씩 String 배열 형태로 한번에 읽어 옴


                tboxConfigData.Text = sb.ToString();

                _dData.Clear();   // 기존에 Dictionary에 Data가 남아 있을 수 있으므로 작성 하기 전 초기화 시킴
                _dData = _xml.fXML_Reader(strFilePath);   // 작성 한 CXMLControl에서 fXML_Reader를 호출해서 XML File을 읽어서 필요한 정보를 Dictionary 형태로 가져 옴
            }
        }


        /// <summary>
        /// Config Data를 Group Box안에 있는 Control들에 Set
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnConfigRead_Click(object sender, EventArgs e)
        {
            //string[] strConfig = tboxConfigData.Text.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);  // 문자열 안에있는 '\r\n'을 기준으로 split 시킴

            //tboxData.Text = strConfig[0];
            //cboxData.Checked = bool.Parse(strConfig[1]);
            //numData.Value = int.Parse(strConfig[2]);


            // Dictionary에 있는 정보를 UI에 입력함
            tboxData.Text = _dData[CXMLControl._TEXT_DATA];
            cboxData.Checked = bool.Parse(_dData[CXMLControl._CBOX_DATA]);
            numData.Value = int.Parse(_dData[CXMLControl._NUMBER_DATA]);
        }
    }
}