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

이 도구가 하는 일

C#이나 Java와 달리 C++에는 XML 직렬화기가 기본 내장되어 있지 않습니다. struct나 class에 맞는 XML 페이로드가 필요하면 XML을 손으로 쓰거나, pugixml을 연결하거나, Xerces-C++를 끌어오거나, Expat로 조립해야 하죠 — 그 어느 쪽이든 테스트 한 번 돌리기 전에 타이핑이 엄청나게 쌓입니다. 여기에 C++을 붙여넣으면 한 번에 XML이 나오고, 필드는 모두 제자리에 들어갑니다.

사람이 코드를 읽듯이 읽습니다. C++20의 designated initializer가 붙은 struct Order { std::string orderId; std::vector<OrderItem> items; };<Order><orderId/><items><OrderItem/>...</items></Order>가 되고, 중첩된 struct는 그 안에 인라인으로 펼쳐집니다. std::string 값은 제대로 이스케이프되고(익숙한 &, <, >, ", '), 숫자 타입은 리터럴 형태를 유지하며, booltrue / false로 나와서 표준 준수 XML 리더가 기대할 만한 어떤 스키마에도 깔끔하게 파싱됩니다.

컨테이너는 직접 손으로 쓸 때와 같은 모양을 따릅니다. std::vector<T>, std::array, 순수 C 배열은 요소 타입 이름을 딴 자식 하나씩을 품은 부모 요소가 됩니다. std::mapstd::unordered_map<Entry><Key/><Value/></Entry> 쌍을 내보냅니다. nullopt를 담은 std::optional은 사라지는 대신 빈 요소가 됩니다 — 그래야 라운드트립에서 스키마 일관성이 유지되죠. 생성자 호출이든, designated-initializer 리터럴이든, 그냥 타입 정의든 셋 다 처리합니다.

사용 방법

세 단계. struct 하나만 붙여넣든 헤더 전체에 샘플 인스턴스까지 붙이든 상관없이 잘 동작합니다.

1

C++을 붙여넣기 (또는 샘플 시도)

왼쪽 에디터에 아무 C++이나 넣으세요 — struct 정의, 메서드가 있는 class, designated initializer, 생성자 호출. #include 헤더, 주석, using 지시자가 섞여 있어도 파서가 헷갈리지 않습니다.

샘플 인스턴스가 붙은 깔끔한 struct가 좋겠다면 샘플 불러오기를 클릭하세요. C++20 designated-initializer 문법으로 OrderItemAddress가 중첩된 현실적인 Order가 들어옵니다.

2

변환 누르기

초록색 변환 버튼을 클릭하세요. 도구가 타입을 훑고, 중첩된 struct를 펼치고, XML을 써냅니다. 처리 중에는 짧은 로딩 표시가 도는데 보통 1~2초면 끝납니다.

3

XML 복사

오른쪽 패널이 well-formed에 들여쓰기까지 된 XML로 채워집니다. SOAP 요청, app.xml 설정 파일, 유닛 테스트용 std::ifstream 픽스처, pugixml의 load_string 테스트에 그대로 복사해 넣으세요 — 유효하고, 이스케이프되었으며, 바로 쓸 수 있습니다.

실제로 유용할 때

SOAP / 웹서비스 페이로드 프로토타이핑

레거시 SOAP 엔드포인트용 C++ 요청 struct가 있고 SoapUI나 curl에 넣을 현실적인 XML 본문이 필요할 때. struct 붙여넣고, XML 받고, 다음 작업으로.

pugixml / Xerces 테스트 픽스처 만들기

XML 로더의 유닛 테스트에는 다양한 well-formed 문서가 필요합니다. 손으로 쓰기는 지겹죠. 실제 struct에서 생성하면 픽스처가 테스트 대상 타입과 싱크 상태로 유지됩니다.

코드에서 설정 템플릿 만들기

XML에서 설정을 읽는 게임 엔진, CAD 툴, 시뮬레이션은 보통 C++ 쪽에 Settings struct를 가지고 있습니다. 붙여넣으면 릴리스 빌드에 바로 편집해서 쓸 수 있는 XML 템플릿이 나옵니다 — 손으로 짠 보일러플레이트 없이.

레거시 XML 시스템과 연결

금융, 의료, 국방 스택은 여전히 XML을 씁니다. 새 C++ 서비스가 오래된 컨슈머에게 XML 메시지를 보내야 할 때, 실제 직렬화기를 붙이기 전에 이 도구가 어떤 모양이어야 하는지 미리 보여줍니다.

자주 묻는 질문

여러 struct가 들어간 헤더 파일 전체를 붙여도 되나요?

네. 헤더 전체를 붙여넣으세요 — 모든 structclass가 다 처리되고, 중첩된 타입은 인라인으로 펼쳐지며, 기반 클래스에서 상속받은 public 멤버도 같이 합쳐집니다. 파서는 주석, 전처리기 지시자, 전방 선언에 관대합니다.

C++20 designated initializer도 이해하나요?

네. Order order{ .orderId = "ORD-4821", .items = { ... } };는 필드 단위로 파싱되어 XML에 여러분이 쓴 이름 그대로 남습니다. 예전 스타일의 aggregate initialization(위치 기반 Order{ "ORD-4821", ... })도 같은 붙여넣기 안에 struct 정의가 있으면 동작합니다 — 도구가 위치를 필드 이름에 매칭합니다. cppreference의 aggregate initialization을 참고하세요.

std::vector, std::map, std::optional은 어떻게 처리되나요?

std::vector<T>, std::array, 순수 C 배열은 요소 타입 이름을 딴 자식 하나씩을 품은 컨테이너 요소가 됩니다. std::map / std::unordered_map<Entry><Key/><Value/></Entry> 쌍을 내보냅니다. nulloptstd::optional은 사라지지 않고 빈 요소가 되어 스키마에 그대로 남습니다.

그냥 pugixml이나 libxml2를 쓰면 안 되나요?

런타임 직렬화에는 훌륭한 라이브러리들입니다. 하지만 첫 번째 픽스처 — 또는 설정 템플릿, 문서 예제 — 를 만든다는 건 결국 XML 트리를 직접 타이핑한다는 뜻이죠. 이 도구는 그 첫 라운드의 타이핑을 덜어 줍니다. 결과는 나중에 pugixml, Xerces-C++, RapidXML 어디로든 흘려 보낼 수 있습니다.

내 코드는 저장되나요?

변환을 위해 코드가 백엔드로 전송되지만 저장되지는 않습니다 — 페이로드를 로그에 남기지 않습니다. 정말 민감한 코드(독점 게임 엔진 내부, 트레이딩 모델 등)라면 다른 온라인 도구를 쓸 때처럼 붙여넣기 전에 한 번 훑어보세요.

template이나 포인터, 스마트 포인터가 있으면요?

std::vector<int> 같은 구체 템플릿 인스턴스화는 바로 동작합니다. 해결되지 않은 템플릿 매개변수(구체 T가 없는 template<typename T>)는 빈 요소로 나옵니다 — 실제 데이터가 필요하면 구체 타입을 정해 주세요. raw 포인터와 std::unique_ptr / std::shared_ptr는 가리키는 대상을 따라갑니다. null 포인터는 전체 변환을 실패시키지 않고 빈 요소가 됩니다.

함께 쓰기 좋은 도구

C++ to XML은 퍼즐의 한 조각일 뿐입니다. 다음 도구들과 궁합이 좋아요: