MYMONDAY.ai
서비스스튜디오도구데이터·포맷73CSS 생성기19색상·이미지10인코딩·보안10웹·SEO11개발·데브옵스10파일·내보내기18계산기6가이드

XML C# 클래스 변환기

샘플 XML을 이름이 예측 가능한 C# 클래스, List<T> 컬렉션, nullable 선택 멤버로 바꿉니다.

  • 브라우저에서 처리
  • 가입 없음
  • 무료

도구 작업 공간

예제

옵션

XML → 데이터 매핑

속성은 이 문자로 시작하는 키가 되어 id="1"은 @id가 됩니다. 비우면 속성 이름 그대로 씁니다.

속성이나 자식 요소와 함께 있는 텍스트는 이 키에 담습니다.

끄면 <item>이 하나일 땐 객체, 여러 개일 땐 배열이 됩니다. 켜면 개수와 상관없이 구조가 같습니다.

끄면 모든 값이 문자열로 남습니다. 켜면 true/false, 정수, 소수는 해당 타입이 되고 007이나 긴 ID는 문자열로 둡니다.

XML 입력

21줄491byte

결과

⌘/Ctrl + Enter로 복사
결과 · Payload.cs
#nullable enable
using System.Collections.Generic;
using System.Text.Json.Serialization;

public class Payload
{
    [JsonPropertyName("order")]
    public PayloadOrder Order { get; set; } = new();
}

public class PayloadOrder
{
    [JsonPropertyName("@id")]
    public int Id { get; set; }
    [JsonPropertyName("@status")]
    public string Status { get; set; } = string.Empty;
    [JsonPropertyName("customer")]
    public PayloadOrderCustomer Customer { get; set; } = new();
    [JsonPropertyName("items")]
    public PayloadOrderItems Items { get; set; } = new();
    [JsonPropertyName("total")]
    public double Total { get; set; }
    [JsonPropertyName("shipped_at")]
    public string ShippedAt { get; set; } = string.Empty;
    [JsonPropertyName("tracking")]
    public string Tracking { get; set; } = string.Empty;
}

public class PayloadOrderCustomer
{
    [JsonPropertyName("@id")]
    public int Id { get; set; }
    [JsonPropertyName("@vip")]
    public bool Vip { get; set; }
    [JsonPropertyName("name")]
    public string Name { get; set; } = string.Empty;
    [JsonPropertyName("email")]
    public string Email { get; set; } = string.Empty;
}

public class PayloadOrderItems
{
    [JsonPropertyName("item")]
    public List<PayloadOrderItemsItem> Item { get; set; } = new();
}

public class PayloadOrderItemsItem
{
    [JsonPropertyName("@sku")]
    public string Sku { get; set; } = string.Empty;
    [JsonPropertyName("@qty")]
    public int Qty { get; set; }
    [JsonPropertyName("name")]
    public string Name { get; set; } = string.Empty;
    [JsonPropertyName("price")]
    public double Price { get; set; }
}
타입5
크기1.6kB

이 변환기는 XML 문서에 대한 C# 클래스를 씁니다. 먼저 XML to JSON 변환기와 같은 규칙으로 XML을 데이터로 바꾸고, 그 데이터를 설명하는 클래스를 만듭니다. 자식이나 속성이 있는 요소마다 클래스 하나, 키마다 프로퍼티 하나가 생기고 모든 프로퍼티에 [JsonPropertyName("...")]가 붙어 키 철자가 명시됩니다.

그래서 결과물은 XmlSerializer가 아니라 System.Text.Json과 변환된 데이터를 위한 모델입니다. 속성 키는 접두사를 유지하므로 속성 sku는 [JsonPropertyName("@sku")] public string Sku로 선언됩니다. 원본 XML을 XmlSerializer로 역직렬화하려면 프로퍼티 목록만 가져가 [XmlAttribute], [XmlElement], [XmlText]로 바꾸세요.

입력은 엄격한 XML 1.0 파서가 읽습니다. 오류는 정확한 행과 열로 알려 주고 편집기에서 해당 줄을 표시합니다. 20 MiB까지 브라우저에서 처리하며 업로드하지 않습니다.

사용 방법

  1. XML 붙여넣기

    문서를 붙여 넣거나 예제 세 가지 중 하나를 엽니다. 입력하는 동안 클래스가 다시 생성됩니다.

  2. 매핑 조정

    XML 데이터 매핑 패널에서 속성 접두사, 텍스트 키, 항상 배열, 숫자 추론을 바꿉니다. 추론을 끄면 모든 프로퍼티가 string입니다.

  3. 타입 이름 정하기

    루트 클래스 이름(기본 Payload)과 선택 사항인 네임스페이스를 적습니다. 네임스페이스는 namespace X; 한 줄로 출력됩니다.

  4. 클래스 읽기

    각 클래스는 속성이 먼저 오고 문서 순서대로 프로퍼티를 나열합니다. 혼합 콘텐츠는 코드 위에 경고로 표시됩니다.

  5. 복사 또는 저장

    코드를 복사하거나 루트 클래스 이름의 .cs 파일로 내려받습니다. 기본 파일 이름은 Payload.cs입니다.

작동 원리

XML 구성 요소와 C# 멤버

데이터에서는 속성이 접두사가 붙은 키로, 속성이나 자식 옆의 텍스트가 텍스트 키로 들어갑니다. C# 프로퍼티 이름은 접두 문자를 뺀 키의 파스칼 케이스라서 @id는 Id, xml:lang은 XmlLang, #text는 Text입니다. 각 프로퍼티의 특성에는 정확한 키가 그대로 들어갑니다.

XML데이터 키C# 멤버
<name>Ada</name>namestring Name, 초기값 string.Empty
id="7"@idint Id, JsonPropertyName("@id")
id="3000000000"@idlong Id
<price>19.5</price>pricedouble Price
<ok>true</ok>okbool Ok
반복되는 <item>itemList<PayloadItem> Item, 초기값 new()
일부 item에만 있는 키선택int? Qty

선택 멤버, 유니온, 알 수 없는 값

반복 요소는 모든 키의 합집합을 가진 클래스 하나로 합쳐집니다. 일부 발생에서 빠진 값 타입은 int?나 double?가 되고, 파일 맨 위에 #nullable enable이 붙습니다. 문자열과 리스트는 기본값으로 초기화되어 new 직후에도 바로 쓸 수 있습니다.

한 위치에 <v>1</v><v>a</v>처럼 종류가 다른 값이 섞이면 타입은 JsonElement로 바뀌고 using System.Text.Json;이 추가됩니다. 정수는 2147483647까지 int, 그보다 크면 long입니다.

public class PayloadOrderItem
{
    [JsonPropertyName("@sku")]
    public string Sku { get; set; } = string.Empty;
    [JsonPropertyName("@qty")]
    public int? Qty { get; set; }
}

샘플에 따라 모양이 달라지는 이유

자식이 하나면 객체이고 여럿이면 리스트입니다. 자식 요소는 항상 배열로 옵션을 켜면 샘플에 하나뿐이어도 List<T>가 유지되어, 더 긴 문서를 역직렬화할 때 JsonException이 나지 않습니다.

실제 예시

반복 항목이 있는 주문
입력
<order id="1042"><item sku="A1" qty="1">Pen</item><item sku="B7">Ink</item></order>
출력
#nullable enable
using System.Collections.Generic;
using System.Text.Json.Serialization;

public class Payload
{
    [JsonPropertyName("order")]
    public PayloadOrder Order { get; set; } = new();
}

public class PayloadOrder
{
    [JsonPropertyName("@id")]
    public int Id { get; set; }
    [JsonPropertyName("item")]
    public List<PayloadOrderItem> Item { get; set; } = new();
}

public class PayloadOrderItem
{
    [JsonPropertyName("@sku")]
    public string Sku { get; set; } = string.Empty;
    [JsonPropertyName("@qty")]
    public int? Qty { get; set; }
    [JsonPropertyName("#text")]
    public string Text { get; set; } = string.Empty;
}

두 item 요소가 클래스 하나를 공유합니다. Qty는 한쪽에만 있어 int?이고, 요소의 텍스트는 Text 프로퍼티입니다.

네임스페이스와 하이픈이 있는 이름
입력
<doc xml:lang="en" data-id="5"><title>Hi</title></doc>
출력
#nullable enable
using System.Text.Json.Serialization;

public class Payload
{
    [JsonPropertyName("doc")]
    public PayloadDoc Doc { get; set; } = new();
}

public class PayloadDoc
{
    [JsonPropertyName("@xml:lang")]
    public string XmlLang { get; set; } = string.Empty;
    [JsonPropertyName("@data-id")]
    public int DataId { get; set; }
    [JsonPropertyName("title")]
    public string Title { get; set; } = string.Empty;
}

xml:lang과 data-id는 C# 식별자가 될 수 없어 프로퍼티는 XmlLang, DataId가 되고 특성에는 원래 키가 남습니다.

추론과 CDATA
입력
<p><zip>02134</zip><qty>3</qty><price>19.5</price><ok>true</ok><note><![CDATA[42]]></note></p>
출력
#nullable enable
using System.Text.Json.Serialization;

public class Payload
{
    [JsonPropertyName("p")]
    public PayloadP P { get; set; } = new();
}

public class PayloadP
{
    [JsonPropertyName("zip")]
    public string Zip { get; set; } = string.Empty;
    [JsonPropertyName("qty")]
    public int Qty { get; set; }
    [JsonPropertyName("price")]
    public double Price { get; set; }
    [JsonPropertyName("ok")]
    public bool Ok { get; set; }
    [JsonPropertyName("note")]
    public string Note { get; set; } = string.Empty;
}

02134는 앞자리 0 때문에 string, 19.5는 double, 3은 int입니다. CDATA의 42는 텍스트로 취급되어 추론하지 않습니다.

자주 하는 실수

  • XmlSerializer용 모델이 아닙니다

    특성은 System.Text.Json과 변환된 데이터를 위한 것입니다. XmlSerializer는 JsonPropertyName을 무시하고 [XmlAttribute], [XmlElement]를 기대합니다.

  • 프로퍼티 이름만 바꾸면 매핑이 깨집니다

    모든 프로퍼티에 이름이 명시되어 있어 기본 설정인 대소문자 구분 JsonSerializer로 동작합니다. 프로퍼티 이름을 바꿀 때는 JsonPropertyName도 함께 바꾸세요. 그렇지 않으면 키가 맞지 않습니다.

  • decimal을 원했는데 int가 나올 때

    샘플 가격이 19이면 int가 되고 19.0도 숫자 19로 읽혀 마찬가지로 int입니다. 19.5처럼 소수부가 있는 값을 샘플에 넣거나, 추론을 끄거나, 타입을 decimal로 직접 바꾸세요.

  • 샘플에 없으면 클래스에도 없습니다

    선택 멤버는 붙여 넣은 발생끼리 비교해서 찾습니다. 한 번도 나오지 않은 키는 프로퍼티가 없어 역직렬화 때 무시됩니다.

자주 묻는 질문

특성은 어떤 JSON 라이브러리용인가요?

System.Text.Json용입니다. 각 프로퍼티에 System.Text.Json.Serialization의 [JsonPropertyName]이 붙으므로 최신 .NET에서는 별도 패키지가 필요 없습니다.

XML 자체는 어떻게 역직렬화하나요?

XML을 XML to JSON 변환기로 변환된 JSON으로 만든 뒤 JsonSerializer.Deserialize<Payload>를 호출하세요. 생성된 클래스는 그 JSON과 필드 단위로 일치합니다.

키에서 @를 뺄 수 있나요?

네. 매핑 패널에서 속성 접두사를 비우거나 바꾸면 됩니다. 프로퍼티 이름은 그대로고 특성 문자열만 바뀝니다.

프로퍼티가 왜 nullable인가요?

그 요소의 발생 중 적어도 하나에 해당 키가 없었기 때문입니다. nullable 값 타입은 null로 없음을 나타냅니다.

네임스페이스가 추가되나요?

네임스페이스 옵션에 직접 적었을 때만 파일 범위 선언으로 추가됩니다. 비워 두면 전역 타입이 됩니다.

서버로 전송되는 것이 있나요?

없습니다. 파싱과 코드 생성이 모두 브라우저 탭 안에서 실행됩니다.

마지막 업데이트: