왼쪽에 Elixir를 붙여넣고 "변환"을 누르세요 — XML로 바꿔드립니다Elixir 코드 붙여넣기

이 도구가 하는 일

Elixir 앱을 레거시 SOAP 엔드포인트에 연결하거나, XML-RPC 연동 테스트용 픽스처를 만들 때, struct는 있는데 엔벨로프가 없는 상황이 있죠. 필드마다 XmlBuilder.element/3를 손으로 쓰는 건 금방 지겨워집니다. 여기에 Elixir를 붙여넣으세요 — %Order{} 리터럴 하나든, defstruct가 들어간 defmodule이든, 모듈 여러 개가 포함된 파일 전체든 — 한 번에 잘 정제된 XML이 돌아옵니다. XmlBuilder가 만드는 것과 같은 형태로, 귀찮은 절차 없이요.

변환기는 Elixir의 시맨틱을 이해합니다. 아톰은 앞의 콜론이 사라져 — 맵 키 :is_paid는 요소 이름 is_paid가 되고, true / false는 텍스트로 남습니다. Decimal.new("249.99")는 래퍼가 벗겨져 249.99가 됩니다. DateTime, NaiveDateTime, Date는 ISO-8601 문자열로 나옵니다. 중첩 struct(shipping_address: %Address{} 필드를 가진 %Order{} 같은)는 그 자리에서 펼쳐지고, nil 값은 버려지지 않고 빈 요소가 됩니다. [sku: "SKU-101", qty: 2] 같은 키워드 리스트는 동등한 맵과 똑같이 취급됩니다.

리스트는 항목당 하나의 자식 요소를 가진 컨테이너 요소가 되며, struct 타입 이름을 따릅니다. items: [%OrderItem{}, %OrderItem{}] 필드는 <items><OrderItem/><OrderItem/></items>가 됩니다. 이 형태는 SweetXml이 XML을 Elixir로 다시 읽어들이는 방식과, 그 밑에서 쓰이는 xmerl 라이브러리가 기대하는 것과 맞아떨어집니다. 튜플은 <tuple> 래퍼와 위치 기반 자식 요소를 갖습니다. defmodule 블록을 여러 개 붙여넣어도 모든 defstruct가 출력에 들어갑니다. .ex.exs 파일에 있는 그대로 붙여넣으면 됩니다 — 정리할 필요 없습니다.

사용 방법

세 단계면 끝. struct 하나를 붙여넣든, Phoenix 컨텍스트 파일 전체를 붙여넣든 똑같이 동작합니다.

1

Elixir 붙여넣기 (또는 샘플 사용)

왼쪽 에디터에 Elixir를 그대로 넣으세요. defstruct, %Struct{} 리터럴, 평범한 map, 키워드 리스트, 중첩 struct — 다 괜찮습니다. 현실적인 Order / OrderItem / Address 예제는 샘플 불러오기를 누르세요.

@moduledoc를 떼거나 @derive 주석을 지우거나 파이프와 주석을 정리할 필요 없습니다. 에디터에서 보이는 그대로 Elixir 코드를 붙여넣으세요.

2

변환 버튼 누르기

초록색 변환 버튼을 누르세요. 도구가 Elixir를 읽고, 모든 필드를 유지하며, 중첩 struct를 보존하고, 한 번에 XML을 만듭니다. 처리 중엔 짧은 로딩 인디케이터가 돕니다.

3

XML 복사

오른쪽 패널이 들여쓰기된 정제된 XML로 채워집니다. SOAP 요청 본문, XML-RPC 호출, 테스트 픽스처, 연동 스위트의 시드 파일에 곧바로 붙여넣으세요.

실제로 요긴한 경우

SOAP 서비스와 대화하는 Phoenix 앱

Phoenix 컨텍스트가 깔끔한 <code>%Order{}</code>를 건네줍니다. 하지만 하류 벤더는 SOAP만 씁니다. struct를 붙여넣고 XML 엔벨로프 본문을 받아 요청에 넣으세요 — <code>XmlBuilder</code> 트리를 손으로 만들 필요 없습니다.

XML-RPC 연동

오래된 WordPress 플러그인, 레거시 CMS, 금융 피드 — 여전히 XML-RPC로 말합니다. Elixir struct를 스펙이 기대하는 <code>&lt;param&gt;&lt;value&gt;&lt;struct&gt;</code> 형태로 바꿔서 바로 <code>HTTPoison</code>에 흘려보내세요.

레거시 엔터프라이즈 연동

은행 파일, EDI 피드, HL7 스타일의 의료 페이로드. 파트너가 XML을 고집하면, 이미 갖고 있는 Elixir 모델을 붙여넣고 맞는 XML 템플릿을 받으세요 — <code>xmerl</code>과 처음부터 씨름하는 것보다 빠릅니다.

SweetXml 라운드트립용 픽스처

SweetXml로 XML을 읽어 struct와 비교하는 테스트를 쓰고 있나요? struct를 붙여넣고 XML을 얻어 픽스처로 저장하세요. 라운드트립이 일관되게 유지됩니다.

자주 묻는 질문

defmodule / defstruct 블록을 한꺼번에 여러 개 붙여넣을 수 있나요?

네. 파일 전체를 붙여넣어도 됩니다. 모든 defstruct는 필드를 그대로 유지한 채 나오고, 중첩 struct 참조도 펼쳐집니다. 맨 아래에 실제 값이 들어간 %Struct{} 리터럴을 넣으면 그 값이 출력에 쓰이고 — 없으면 빈 요소 형태로 나옵니다.

아톰은 어떻게 처리되나요?

맵 / struct 키로 쓰인 아톰은 요소 이름이 됩니다 (앞의 콜론이 사라져 :is_paidis_paid가 됩니다). 불리언성 아톰(true, false, nil)은 해당 텍스트가 됩니다. 그 외 아톰은 콜론을 뗀 텍스트로 나옵니다 (:pendingpending). 원래 아톰 구문이 필요하면 파싱 후 String.to_atom/1으로 후처리하세요.

Decimal, DateTime, Date, NaiveDateTime은 어떻게 되나요?

Decimal.new("249.99")는 래퍼가 벗겨져 249.99가 됩니다. DateTime, NaiveDateTime, Date는 ISO-8601 문자열로 나옵니다. TimeHH:MM:SS가 됩니다. nil 값은 버려지지 않고 빈 요소가 되어 SweetXml 라운드트립에서도 형태가 일관됩니다.

리스트, 튜플, 키워드 리스트는 어떻게 변환되나요?

struct 리스트는 항목당 하나의 자식을 가진 컨테이너 요소가 되며, 각 자식 이름은 struct 이름을 따릅니다. items: [%OrderItem{}, ...]<items><OrderItem/><OrderItem/></items>가 됩니다. 스칼라 리스트는 컨테이너 안에서 <item> 자식이 됩니다. 튜플은 <tuple> 래퍼에 위치 기반 자식 <_0/>, <_1/>이 붙습니다. 키워드 리스트는 맵과 같이 취급되어 각 키가 자식 요소가 됩니다.

struct가 Jason / Poison용 @derive를 쓰면요?

@derive 주석은 JSON 라이브러리를 위한 컴파일타임 힌트라서 XML 출력엔 영향이 없습니다. 모든 struct 필드는 기본적으로 나옵니다. 특정 필드를 빼고 싶으면, 붙여넣기 전에 defstruct 목록에서 지우거나, 값을 변환기가 "스킵"으로 인식할 수 있는 무언가로 감싸세요.

내 코드는 저장되나요?

코드는 변환을 위해 백엔드로 보내지지만 보관하지는 않습니다 — 페이로드를 로그에 남기지 않습니다. 온라인 도구를 쓸 때 늘 그렇듯, 정말 민감한 코드라면 붙여넣기 전에 한 번 훑어보세요.

도움이 될 만한 다른 도구

Elixir에서 XML로는 퍼즐의 한 조각일 뿐입니다. 이 도구들과 잘 어울립니다: