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

XML Python 데이터클래스 변환기

샘플 XML을 요소와 속성마다 타입 힌트가 달린 Python dataclass 또는 Pydantic v2 모델로 바꿉니다.

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

도구 작업 공간

예제

옵션

스타일

XML → 데이터 매핑

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

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

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

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

XML 입력

21줄491byte

결과

⌘/Ctrl + Enter로 복사
결과 · payload.py
from __future__ import annotations

from dataclasses import dataclass


@dataclass
class PayloadOrderCustomer:
    id: int  # JSON key: "@id"
    vip: bool  # JSON key: "@vip"
    name: str
    email: str


@dataclass
class PayloadOrderItemsItem:
    sku: str  # JSON key: "@sku"
    qty: int  # JSON key: "@qty"
    name: str
    price: float


@dataclass
class PayloadOrderItems:
    item: list[PayloadOrderItemsItem]


@dataclass
class PayloadOrder:
    id: int  # JSON key: "@id"
    status: str  # JSON key: "@status"
    customer: PayloadOrderCustomer
    items: PayloadOrderItems
    total: float
    shipped_at: str
    tracking: str


@dataclass
class Payload:
    order: PayloadOrder
타입5
크기694byte

이 변환기는 샘플 XML에 대한 Python 타입 정의를 씁니다. 모든 XML 변환기가 공유하는 규칙으로 XML을 데이터로 매핑하므로, 타입은 변환된 JSON을 불러왔을 때 얻는 딕셔너리를 설명합니다. 스타일 옵션에서 표준 @dataclass와 Pydantic v2 BaseModel 중 하나를 고릅니다.

두 스타일은 특이한 키를 다르게 처리합니다. Pydantic 모델은 sku: str = Field(alias="@sku")로 선언해 model_validate가 실제 키를 받아들입니다. dataclass에는 별칭 기능이 없으므로 필드 뒤에 주석 # JSON key: "@sku"를 남기고, 딕셔너리 키 매핑은 직접 해야 합니다. 필드 이름은 스네이크 케이스라서 xml:lang은 xml_lang이 됩니다.

입력은 엄격한 XML 1.0 파서가 읽고 오류의 행과 열을 보여 주며 20 MiB까지 받습니다. 서버로 보내는 것은 없습니다.

사용 방법

  1. XML 붙여넣기

    문서를 붙여 넣거나 예제를 고릅니다. 입력하는 대로 Python 코드가 갱신됩니다.

  2. 매핑 설정

    XML 데이터 매핑 패널에서 속성 접두사, 텍스트 키, 항상 배열, 숫자 추론을 고릅니다.

  3. 스타일 고르기

    루트 클래스 이름(기본 Payload)을 정하고 dataclass와 Pydantic v2 중 하나를 선택합니다.

  4. 클래스 읽기

    중첩 클래스가 먼저, 루트 클래스가 마지막에 와서 모든 이름이 쓰이기 전에 정의됩니다. dataclass에서는 필수 필드가 선택 필드보다 앞에 옵니다.

  5. 복사 또는 다운로드

    코드를 복사하거나 루트 이름의 스네이크 케이스인 payload.py로 내려받습니다.

작동 원리

타입, 유니온, 알 수 없는 값

Python은 int와 float를 구분하므로 정수는 int, 소수는 float입니다. 파일은 from __future__ import annotations로 시작해, dataclass에서는 오래된 인터프리터에서도 int | None과 list[...]를 쓸 수 있습니다.

XMLPython
<name>Ada</name>name: str
id="7"id: int # JSON key: "@id"
<price>19.5</price>price: float
<ok>true</ok>ok: bool
반복되는 <item>item: list[PayloadItem]
일부 item에만 있는 키qty: int | None = None
<v>1</v><v>a</v>v: list[Any], from typing import Any 추가

별칭과 필드 순서

Pydantic은 Field(alias=...)를 써서 변환된 딕셔너리를 모델이 바로 검증합니다. dataclass는 의존성이 없는 대신 키를 바꿀 수 없으므로, 인스턴스를 만들 때 키를 직접 변환하는 경우에만 알맞습니다.

dataclass는 기본값이 있는 필드를 뒤에 두어야 하므로 선택 필드를 끝으로 옮기고, Pydantic은 문서 순서를 유지합니다. 반복 요소의 모든 발생은 클래스 하나가 되고, 일부에서 빠진 키는 T | None = None입니다.

class PayloadOrderItem(BaseModel):
    sku: str = Field(alias="@sku")
    qty: int | None = Field(default=None, alias="@qty")
    text: str = Field(alias="#text")

자식 하나일 때와 리스트

<item>이 하나면 중첩 모델, 여럿이면 list[PayloadItem]입니다. 자식 요소는 항상 배열로 옵션을 켜면 하나뿐인 샘플에서도 리스트 타입이 유지되어 더 긴 문서의 검증이 실패하지 않습니다.

실제 예시

반복 항목이 있는 주문, dataclass
입력
<order id="1042"><item sku="A1" qty="1">Pen</item><item sku="B7">Ink</item></order>
출력
from __future__ import annotations

from dataclasses import dataclass


@dataclass
class PayloadOrderItem:
    sku: str  # JSON key: "@sku"
    text: str  # JSON key: "#text"
    qty: int | None = None  # JSON key: "@qty"


@dataclass
class PayloadOrder:
    id: int  # JSON key: "@id"
    item: list[PayloadOrderItem]


@dataclass
class Payload:
    order: PayloadOrder

선택 필드인 qty는 None 기본값과 함께 끝으로 이동합니다. dataclass는 키를 별칭으로 바꿀 수 없어 특이한 키마다 JSON key 주석을 남깁니다.

별칭이 있는 Pydantic v2
입력
<doc xml:lang="en" data-id="5"><title>Hi</title></doc>
출력
from __future__ import annotations

from pydantic import BaseModel, Field


class PayloadDoc(BaseModel):
    xml_lang: str = Field(alias="@xml:lang")
    data_id: int = Field(alias="@data-id")
    title: str


class Payload(BaseModel):
    doc: PayloadDoc

xml:lang과 data-id는 xml_lang, data_id가 되고 Field(alias=...)가 정확한 키를 유지해 model_validate가 변환된 데이터를 받습니다.

추론과 CDATA
입력
<p><zip>02134</zip><qty>3</qty><price>19.5</price><ok>true</ok><note><![CDATA[42]]></note></p>
출력
from __future__ import annotations

from dataclasses import dataclass


@dataclass
class PayloadP:
    zip: str
    qty: int
    price: float
    ok: bool
    note: str


@dataclass
class Payload:
    p: PayloadP

zip은 앞자리 0 때문에 str, qty는 int, price는 float, ok는 bool입니다. CDATA의 42는 추론하지 않아 str로 남습니다.

자주 하는 실수

  • dataclass는 키 이름을 바꾸지 못합니다

    dataclass 필드 id는 Payload(**data)로는 키 @id를 받지 못합니다. Pydantic 스타일을 쓰거나, 속성 접두사를 비우거나, 키를 직접 매핑하세요.

  • Pydantic은 v2가 필요합니다

    model_validate와 Field(alias=...)는 Pydantic 2.x 기준입니다. 1.x는 parse_obj와 다른 설정 방식을 씁니다.

  • 정수처럼 보이는 소수

    19.0은 숫자 19로 읽혀 필드가 int가 되고, 나중에 19.5가 오면 검증이 실패하거나 힌트와 어긋납니다. 추론을 끄거나 타입을 float로 고치세요.

  • int | None은 실행 시 Python 3.10이 필요합니다

    Pydantic은 어노테이션을 평가하므로 int | None에는 Python 3.10 이상이 필요합니다. dataclass는 future import 덕분에 평가가 미뤄집니다.

자주 묻는 질문

dataclass와 Pydantic 중 무엇을 고를까요?

변환된 딕셔너리를 바로 검증하려면 별칭으로 특이한 키를 유지하는 Pydantic을, 의존성 없이 키를 직접 변환하려면 dataclass를 고르세요.

필드 이름이 왜 xml_lang인가요?

키 @xml:lang은 Python 식별자가 될 수 없기 때문입니다. 필드는 스네이크 케이스이고 원래 키는 별칭이나 주석으로 남습니다.

출력물이 XML을 파싱하나요?

아니요. 클래스는 변환된 JSON의 딕셔너리를 설명합니다. 파이썬에서 원본 XML을 읽으려면 먼저 xml.etree.ElementTree나 xmltodict 같은 라이브러리를 쓰세요.

list[Any]는 무슨 뜻인가요?

같은 요소 이름에 숫자와 단어처럼 종류가 다른 값이 있어 리스트에 하나의 요소 타입을 정할 수 없다는 뜻입니다.

키에서 @를 뺄 수 있나요?

네. 매핑 패널에서 속성 접두사를 빈 문자열로 두면 주석과 별칭에 일반 이름이 나옵니다.

XML이 어딘가로 전송되나요?

아니요. 변환은 브라우저 탭 안에서 실행됩니다.

마지막 업데이트: