이 변환기는 샘플 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까지 받습니다. 서버로 보내는 것은 없습니다.
사용 방법
XML 붙여넣기
문서를 붙여 넣거나 예제를 고릅니다. 입력하는 대로 Python 코드가 갱신됩니다.
매핑 설정
XML 데이터 매핑 패널에서 속성 접두사, 텍스트 키, 항상 배열, 숫자 추론을 고릅니다.
스타일 고르기
루트 클래스 이름(기본
Payload)을 정하고 dataclass와 Pydantic v2 중 하나를 선택합니다.클래스 읽기
중첩 클래스가 먼저, 루트 클래스가 마지막에 와서 모든 이름이 쓰이기 전에 정의됩니다. dataclass에서는 필수 필드가 선택 필드보다 앞에 옵니다.
복사 또는 다운로드
코드를 복사하거나 루트 이름의 스네이크 케이스인
payload.py로 내려받습니다.
작동 원리
타입, 유니온, 알 수 없는 값
Python은 int와 float를 구분하므로 정수는 int, 소수는 float입니다. 파일은 from __future__ import annotations로 시작해, dataclass에서는 오래된 인터프리터에서도 int | None과 list[...]를 쓸 수 있습니다.
| XML | Python |
|---|---|
<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]입니다. 자식 요소는 항상 배열로 옵션을 켜면 하나뿐인 샘플에서도 리스트 타입이 유지되어 더 긴 문서의 검증이 실패하지 않습니다.
실제 예시
<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 주석을 남깁니다.
<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: PayloadDocxml:lang과 data-id는 xml_lang, data_id가 되고 Field(alias=...)가 정확한 키를 유지해 model_validate가 변환된 데이터를 받습니다.
<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: PayloadPzip은 앞자리 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이 어딘가로 전송되나요?
아니요. 변환은 브라우저 탭 안에서 실행됩니다.
마지막 업데이트:
