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

이 도구가 하는 일

Go 구조체에 맞춘 XML 페이로드를 만들어본 적이 있다면 — SOAP 클라이언트, RSS 피드, 레거시 SaaS 웹훅, 벤더 사이트맵 같은 — 얼마나 번거로운지 이미 알고 있을 겁니다. 직접 xml.Marshal을 호출해도 되지만 그러려면 main.go를 엮고 컴파일해서 출력을 눈으로 확인해야 합니다. 대신 여기에 Go를 붙여넣으면 한 번에 잘 짜인 XML이 돌아옵니다. 구조체 하나, 여러 개가 들어간 파일, Go by Example에서 복붙한 리터럴 — 모두 동일하게 모든 필드가 보존된 완전한 XML 문서를 얻습니다.

encoding/xml 패키지가 실제로 만들어내는 결과를 그대로 반영합니다. xml:"OrderId,attr" 같은 태그는 필드를 부모 요소의 속성으로 바꾸고, xml:"-"는 제외, xml:",omitempty"는 값이 제로값일 때 요소를 빼고, xml:"Items>OrderItem"은 슬라이스를 <Items> 컨테이너로 감싸 요소마다 <OrderItem>을 하나씩 넣습니다. xml:",chardata"는 값을 텍스트 콘텐츠로 넣고, XMLName xml.Name은 요소 자체의 이름을 바꿉니다. nil인 포인터 필드는 ,omitempty가 없을 때만 빈 요소로 출력됩니다 — 표준 라이브러리와 정확히 같은 동작입니다.

스칼라는 Go가 처리하는 방식 그대로입니다. float64는 들어맞을 때 지수 표기를 쓰지 않고, time.Time은 RFC 3339, 불리언은 소문자 true/false, int/uint는 패딩 없이 출력됩니다. 중첩 구조체는 중첩 요소가 되고, 구조체 슬라이스는 같은 레벨의 반복 요소가 됩니다. encoding/xml은 map을 네이티브로 지원하지 않아서 — 도구가 <Entry><Key/><Value/></Entry> 반복 자식으로 평탄화해 형태를 유지합니다. 관용적인 Go를 쓰고 있다면 Effective Go의 스타일 가이드가 이 도구가 기대하는 패턴의 좋은 참고가 됩니다.

사용 방법

세 단계. 구조체 하나든 패키지 파일 전체든 동일하게 동작합니다.

1

Go를 붙여넣기 (또는 샘플 시도)

왼쪽 에디터에 Go를 그대로 붙여넣으세요. 구조체 선언 하나, imports와 여러 타입이 들어간 파일 전체, order := Order{...} 같은 composite literal — 모두 됩니다. 먼저 현실적인 예시를 보고 싶다면 샘플 불러오기를 누르세요.

package 줄을 지우거나 import를 제거하거나 파일을 정리할 필요 없습니다. gofmt를 거친 그대로 붙여넣으면 됩니다. 백틱이 붙은 구조체 태그도 정상적으로 처리합니다.

2

변환 누르기

녹색 변환 버튼을 클릭하세요. 도구가 Go를 읽고 모든 xml 구조체 태그를 반영해 한 번에 XML을 만듭니다. 실행 중에는 짧은 로딩 표시가 보입니다.

3

XML 복사

오른쪽 패널에 표준을 따르는 XML 파서가 받아들일 수 있는 들여쓰기된 XML이 채워집니다. SOAP 봉투, 설정 파일, 테스트 픽스처, API 문서에 그대로 복사해 쓰세요.

실제로 쓸모 있는 순간

SOAP 클라이언트 픽스처 만들기

Go 서비스에서 레거시 엔터프라이즈 SOAP API와 통신할 때. 요청 구조체를 붙여 SoapUI, Postman, 테스트 스위트에 바로 쓸 XML 바디를 얻으세요.

RSS와 Atom 피드

Channel, Item, enclosure 필드가 있는 피드 구조체가 동작하는 RSS/Atom 템플릿이 됩니다 — 핸들러를 엮기 전에 태그 구성을 확인하기 좋습니다.

벤더 설정 파일

사이트맵, 로깅 파이프라인, 레거시 운영 콘솔처럼 여전히 XML 설정을 먹는 SaaS 도구가 있습니다. Go 설정 구조체를 붙여 XML을 바로 꺼내세요.

문서를 정직하게 유지

실제 Go 타입으로부터 README나 API 레퍼런스용 XML 예시를 생성하면, 예시가 main에 들어간 코드와 어긋나지 않습니다.

자주 묻는 질문

한 번에 여러 구조체를 붙여도 되나요?

네 — 파일을 통째로 붙이세요. order := Order{...} 같은 composite literal이 있으면 그걸로, 없으면 다른 구조체들을 참조하는 첫 번째 구조체에서 루트를 감지합니다. 중첩/형제 구조체는 중첩 요소나 별도 프래그먼트로 나오므로 조용히 사라지는 건 없습니다.

xml:"x,attr", xml:"-", xml:",omitempty" 같은 구조체 태그를 지키나요?

네 — 일반적인 변형도 모두 지원합니다. xml:"name"은 요소 이름 변경, xml:"name,attr"은 부모의 속성으로 출력, xml:"-"는 필드 완전 제외, xml:",omitempty"는 제로값 필드 건너뜀, xml:"a>b"는 슬라이스를 <a> 컨테이너로 감싸 요소마다 <b> 하나, xml:",chardata"는 값을 요소 텍스트로, xml:",innerxml"은 원시 XML로 그대로 통과시킵니다. encoding/xml Marshal 레퍼런스에 문서화된 동작과 일치합니다.

특수 필드 XMLName은요?

xml.Name 타입의 XMLName이라는 필드가 있으면 루트 요소 이름이 바뀝니다. XMLName xml.Name `xml:"Order"`<Order>...</Order>를 만듭니다. 없으면 도구는 구조체 타입 이름을 루트로 사용합니다 — xml.Marshal과 동일한 기본값입니다.

포인터, 슬라이스, map은 어떻게 처리하나요?

nil인 포인터 필드는 ,omitempty가 지정되어 있으면 건너뛰고, 그렇지 않으면 빈 요소를 출력합니다. 구조체 슬라이스는 반복되는 형제 요소가 됩니다(태그가 a>b 형식이면 컨테이너로 감쌉니다). map은 encoding/xml이 네이티브로 처리하지 않아 도구가 <Entry><Key/><Value/></Entry> 자식의 연속으로 출력합니다 — 대부분의 경우에 충분하고, 다른 형태가 필요하면 손쉽게 편집할 수 있을 만큼 명시적입니다.

제 코드가 저장되나요?

코드는 변환을 위해 백엔드로 전송되며 저장하지 않습니다 — 페이로드를 로깅하지도 않습니다. 온라인 도구에 대한 표준적인 주의사항: 정말 민감한 코드라면 붙여넣기 전에 한 번 더 확인하세요.

구조체가 encoding/xml이 지원하지 않는 타입(channel, func, complex)을 쓰면요?

전체 변환을 실패시키지 않고 빈 요소로 출력합니다. 런타임에 xml.Marshal이 하는 동작(에러 반환)과 달리, 도구는 계속 진행하므로 나머지 결과는 받아볼 수 있습니다. Go 자체에 문법 오류가 있다면 우선 분명한 것부터 고치세요 — 파서는 관대하지만 완전한 gc는 아닙니다.

함께 쓰기 좋은 다른 도구

Go → XML은 퍼즐의 한 조각입니다. 이 도구들과 잘 어울립니다: