Wanna be Brilliant Full-Stack Developer
C# WINFORMS XMLREADER, XMLWRITER 본문
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]);
}
}
}
'Some Memos > C#' 카테고리의 다른 글
C# RowIndex, ColumnIndex 수정중 (0) | 2023.04.25 |
---|---|
C# WINFORMS Timer (Clicker Game) (0) | 2023.04.24 |
C# WINFORM StreamReader, StreamWriter (0) | 2023.04.18 |
C# WINFORMS 캡슐화, Partial Class (0) | 2023.04.14 |
C# Winforms 오버라이딩과 오버로딩 (0) | 2023.04.13 |