본문 바로가기
📁 [4] 개발자 정보 & 코드 노트/C#

C# Windows Forms 강의 95편: XML 데이터 처리 애플리케이션 제작 - XML 읽기 및 쓰기

by wawManager 2025. 5. 9.

 

1. 강의 개요

이번 강의에서는 XML 데이터를 읽고 쓰는 애플리케이션을 제작합니다.
XML은 데이터를 구조화하여 저장하는 데 널리 사용되는 형식으로,
.NET에서 제공하는 System.Xml 네임스페이스를 활용하여
XML 데이터를 다루는 방법을 학습합니다.
Windows Forms UI를 사용해 데이터를 입력하고 XML 파일로 저장하거나,
XML 파일에서 데이터를 읽어와 DataGridView에 표시하는 기능을 구현합니다.


2. 학습 목표

  • XML 파일을 읽고 쓰는 기본 메서드 구현
  • XmlDocument 및 LINQ to XML을 활용한 XML 데이터 처리
  • DataGridView와 연동하여 데이터를 시각적으로 관리
  • OpenFileDialog 및 SaveFileDialog를 사용한 파일 관리

3. 기능 요구사항

필수 기능

1️⃣ XML 파일 읽기:

  • XML 파일에서 데이터를 읽어와 DataGridView에 표시

2️⃣ XML 파일 쓰기:

  • DataGridView 데이터를 XML 파일로 저장

3️⃣ UI 구성 및 동작:

  • 데이터 입력, 읽기, 저장 버튼 제공

4. 실습: XML 데이터 관리 애플리케이션 제작

1️⃣ 폼 구성

  • 폼(Form) 이름: Form1
  • 컨트롤 배치:

컨트롤 타입 이름 위치 크기

DataGridView dgvData 폼 상단 전체 (600 x 300)
Button btnLoad 폼 하단 왼쪽 (100 x 30)
Button btnSave 폼 하단 중앙 (100 x 30)
Button btnAddRow 폼 하단 오른쪽 (100 x 30)

📌 폼 디자인 예시:

--------------------------------------------------
|         [DataGridView - 데이터 목록]           |
--------------------------------------------------
| [Load 버튼]         [Save 버튼]         [AddRow 버튼] |
--------------------------------------------------

2️⃣ 코드 작성

(1) XML 파일 읽기

using System;
using System.Data;
using System.IO;
using System.Windows.Forms;
using System.Xml;

namespace WindowsFormsApp_XML
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // XML 파일 읽기
        private void btnLoad_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog openFileDialog = new OpenFileDialog())
            {
                openFileDialog.Filter = "XML 파일 (*.xml)|*.xml";

                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    string filePath = openFileDialog.FileName;
                    LoadXml(filePath);
                }
            }
        }

        private void LoadXml(string filePath)
        {
            try
            {
                DataSet dataSet = new DataSet();
                dataSet.ReadXml(filePath);
                dgvData.DataSource = dataSet.Tables[0]; // XML 데이터를 DataGridView에 바인딩
            }
            catch (Exception ex)
            {
                MessageBox.Show($"XML 파일을 읽는 중 오류가 발생했습니다: {ex.Message}", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}

(2) XML 파일 쓰기

        // XML 파일 저장
        private void btnSave_Click(object sender, EventArgs e)
        {
            using (SaveFileDialog saveFileDialog = new SaveFileDialog())
            {
                saveFileDialog.Filter = "XML 파일 (*.xml)|*.xml";

                if (saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    string filePath = saveFileDialog.FileName;
                    SaveXml(filePath);
                }
            }
        }

        private void SaveXml(string filePath)
        {
            try
            {
                DataTable dataTable = (DataTable)dgvData.DataSource;
                if (dataTable == null)
                {
                    MessageBox.Show("저장할 데이터가 없습니다.", "오류", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

                dataTable.WriteXml(filePath);
                MessageBox.Show("데이터가 XML 파일로 저장되었습니다.", "완료", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"XML 파일 저장 중 오류가 발생했습니다: {ex.Message}", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

(3) 데이터 추가 기능

        // 데이터 행 추가
        private void btnAddRow_Click(object sender, EventArgs e)
        {
            DataTable dataTable = (DataTable)dgvData.DataSource;

            if (dataTable == null)
            {
                dataTable = new DataTable();
                dataTable.Columns.Add("Column1");
                dataTable.Columns.Add("Column2");
                dataTable.Columns.Add("Column3");
                dgvData.DataSource = dataTable;
            }

            DataRow newRow = dataTable.NewRow();
            dataTable.Rows.Add(newRow);
        }

(4) Designer 코드

        private void InitializeComponent()
        {
            this.dgvData = new DataGridView();
            this.btnLoad = new Button();
            this.btnSave = new Button();
            this.btnAddRow = new Button();

            // DataGridView 설정
            this.dgvData.Location = new System.Drawing.Point(10, 10);
            this.dgvData.Size = new System.Drawing.Size(600, 300);
            this.dgvData.AllowUserToAddRows = true;

            // Load Button 설정
            this.btnLoad.Location = new System.Drawing.Point(10, 320);
            this.btnLoad.Size = new System.Drawing.Size(100, 30);
            this.btnLoad.Text = "Load";
            this.btnLoad.Click += new EventHandler(this.btnLoad_Click);

            // Save Button 설정
            this.btnSave.Location = new System.Drawing.Point(120, 320);
            this.btnSave.Size = new System.Drawing.Size(100, 30);
            this.btnSave.Text = "Save";
            this.btnSave.Click += new EventHandler(this.btnSave_Click);

            // AddRow Button 설정
            this.btnAddRow.Location = new System.Drawing.Point(230, 320);
            this.btnAddRow.Size = new System.Drawing.Size(100, 30);
            this.btnAddRow.Text = "AddRow";
            this.btnAddRow.Click += new EventHandler(this.btnAddRow_Click);

            // Form 설정
            this.ClientSize = new System.Drawing.Size(640, 360);
            this.Controls.Add(this.dgvData);
            this.Controls.Add(this.btnLoad);
            this.Controls.Add(this.btnSave);
            this.Controls.Add(this.btnAddRow);
            this.Text = "XML 데이터 관리";
        }

3️⃣ 실행 결과

1️⃣ XML 파일 읽기

  • "Load" 버튼 클릭 → OpenFileDialog에서 XML 파일 선택 → DataGridView에 데이터 표시

2️⃣ XML 파일 쓰기

  • DataGridView에 데이터 입력 → "Save" 버튼 클릭 → SaveFileDialog에서 파일 저장

3️⃣ 데이터 추가

  • "AddRow" 버튼 클릭 → DataGridView에 새로운 행 추가

5. 주요 개념 요약

  • XmlDocument 및 LINQ to XML: XML 데이터를 읽고 쓰기 위한 주요 클래스
  • DataSet 및 DataTable: XML 데이터를 메모리에 로드하여 관리
  • OpenFileDialog, SaveFileDialog: 파일 선택 대화 상자

 

📌 #CSharp #WindowsForms #XML #DataGridView #OpenFileDialog #SaveFileDialog