본문 바로가기
카테고리 없음

XML to JSON 파일 변환 (키(key) - 값(Value) 단순한 형태)

by 공부봇 2025. 8. 11.
반응형
 
 

이전 프로그램이 만든 JSON은 XML의 구조(계층, 속성 등)를 그대로 표현하려고 했기 때문에 조금 복잡하게 보였습니다.

원하시는 것처럼 XML 태그 이름을 JSON의 '키(Key)'로, 태그 안의 내용을 '값(Value)'으로 하는 단순한 형태로 만들려면, 변환 로직을 약간 수정해야 합니다.

XML의 내용을 수동으로 읽어서 C#의 Dictionary 형태로 바꾼 다음, 이 Dictionary를 JSON으로 변환하는 방식으로 접근하면 원하시는 결과를 정확히 얻을 수 있습니다.


## 1. 수정된 전체 소스 코드 (Program.cs)

아래는 새로운 요구사항에 맞게 수정한 전체 코드입니다. ConvertXmlToJson 메서드의 내용이 바뀐 것을 확인해 보세요.

using System;
using System.Collections.Generic; // Dictionary를 사용하기 위해 추가
using System.IO;
using System.Linq;                // LINQ를 사용하기 위해 추가
using System.Xml.Linq;            // XDocument를 사용하기 위해 추가
using Newtonsoft.Json;

class Program
{
    static void Main(string[] args)
    {
        // 이 부분은 이전 코드와 동일합니다.
        Console.WriteLine("XML 파일을 단순 JSON으로 변환할 폴더의 전체 경로를 입력하세요:");
        string? directoryPath = Console.ReadLine();

        if (string.IsNullOrWhiteSpace(directoryPath) || !Directory.Exists(directoryPath))
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("오류: 폴더 경로가 잘못되었거나 존재하지 않습니다.");
            Console.ResetColor();
            Console.WriteLine("프로그램을 종료하려면 아무 키나 누르세요.");
            Console.ReadKey();
            return;
        }

        try
        {
            string[] xmlFiles = Directory.GetFiles(directoryPath, "*.xml");

            if (xmlFiles.Length == 0)
            {
                Console.WriteLine("폴더에 변환할 XML 파일이 없습니다.");
            }
            else
            {
                Console.WriteLine($"총 {xmlFiles.Length}개의 XML 파일을 변환합니다...");
                Console.WriteLine("-------------------------------------------");

                foreach (string xmlFilePath in xmlFiles)
                {
                    // 새로 변경된 변환 메서드를 호출합니다.
                    ConvertXmlToSimpleJson(xmlFilePath);
                }

                Console.WriteLine("-------------------------------------------");
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("모든 파일 변환이 완료되었습니다!");
                Console.ResetColor();
            }
        }
        catch (Exception ex)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine($"오류가 발생했습니다: {ex.Message}");
            Console.ResetColor();
        }

        Console.WriteLine("프로그램을 종료하려면 아무 키나 누르세요.");
        Console.ReadKey();
    }

    /// <summary>
    /// [변경됨] XML 파일을 단순 Key-Value 형태의 JSON으로 변환하는 메서드
    /// </summary>
    /// <param name="xmlFilePath">변환할 XML 파일의 경로</param>
    private static void ConvertXmlToSimpleJson(string xmlFilePath)
    {
        try
        {
            // 1. [변경] LINQ to XML을 사용하기 위해 XDocument로 XML 파일을 로드합니다.
            XDocument doc = XDocument.Load(xmlFilePath);

            // 2. [변경] XML의 최상위 노드(Root) 바로 아래에 있는 모든 자식 요소들을 가져와
            //    Dictionary<string, string> 형태로 변환합니다.
            //    - Key: XML 요소의 이름 (예: "lblCoordX1")
            //    - Value: XML 요소의 값 (예: "X-axis")
            var dataDictionary = doc.Root.Elements()
                                      .ToDictionary(
                                          element => element.Name.LocalName, // 키
                                          element => element.Value           // 값
                                      );

            // 3. [변경] 위에서 생성한 Dictionary를 JSON으로 직렬화합니다.
            string jsonText = JsonConvert.SerializeObject(dataDictionary, Formatting.Indented);

            // 4. 새 JSON 파일의 경로를 생성하고 저장하는 로직은 동일합니다.
            string jsonFilePath = Path.ChangeExtension(xmlFilePath, ".json");
            File.WriteAllText(jsonFilePath, jsonText);

            Console.WriteLine($"[성공] {Path.GetFileName(xmlFilePath)} -> {Path.GetFileName(jsonFilePath)}");
        }
        catch (Exception ex)
        {
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine($"[실패] {Path.GetFileName(xmlFilePath)} 변환 중 오류 발생: {ex.Message}");
            Console.ResetColor();
        }
    }
}
 

## 2. 주요 변경점 설명

핵심은 ConvertXmlToSimpleJson 메서드 안의 로직이 완전히 바뀐 것입니다.

  1. XDocument 사용: 기존의 XmlDocument 대신, 더 현대적이고 LINQ와 함께 사용하기 편리한 XDocument로 XML을 불러옵니다. (using System.Xml.Linq; 필요)
  2. ToDictionary() 사용: LINQ의 강력한 기능인 ToDictionary()를 사용합니다.
    • doc.Root.Elements(): XML의 최상위 태그(tagGuiAlignment) 안에 있는 모든 요소(lblCoordX1, lblCoordY1 등)를 가져옵니다.
    • .ToDictionary(element => element.Name.LocalName, element => element.Value): 가져온 각 요소에 대해,
      • element.Name.LocalName (태그 이름)을 Dictionary의 로,
      • element.Value (태그 안의 텍스트)를 Dictionary의 으로 하는
      • 새로운 Dictionary를 한 줄의 코드로 생성합니다.
  3. Dictionary 직렬화: 이렇게 만들어진 Dictionary 객체를 JsonConvert.SerializeObject()에 넣으면, Newtonsoft.Json이 알아서 우리가 원하는 { "키": "값" } 형태의 JSON으로 완벽하게 변환해 줍니다.

## 3. 변환 결과

이제 질문에 주신 XML 파일을 이 프로그램으로 변환하면, 정확히 원하셨던 결과가 나옵니다.

GuiAlignmentUS.xml (변환 전)

<?xml version="1.0" encoding="utf-8"?>
<tagGuiAlignment xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <lblCoordX1>X-axis</lblCoordX1>
  <lblCoordY1>Y-axis</lblCoordY1>
  ...
  <btnApply>Apply</btnApply>
</tagGuiAlignment>

GuiAlignmentUS.json (변환 후)

{
  "lblCoordX1": "X-axis",
  "lblCoordY1": "Y-axis",
  "lblPixel1": "Pixel",
  "btnZoomOut1": "-",
  "btnZoomFit1": "FIT",
  "btnZoomNone1": "1:1",
  "btnZoomIn1": "+",
  ...
  "btnRestore": "Restore",
  "btnApply": "Apply"
}
반응형