C to XML 변환기
C struct나 typedef를 붙여넣으세요. 깔끔한 XML로 받습니다.
이 도구가 하는 일
C에는 내장 XML 직렬화기가 없습니다. typedef struct를 그대로 반영한 XML 문서를 만들려면 보통 libxml2, Expat를 가져오거나, 글자 단위로 손으로 씁니다. 여기에 C를 붙여넣으면 그 첫 타이핑 라운드를 건너뛸 수 있고, 선언한 필드, 중첩 타입, 배열에 맞춰진 well-formed XML이 나옵니다.
장난감 서브셋이 아니라 실제 C를 읽습니다. typedef struct { char orderId[16]; double totalAmount; OrderItem items[2]; } Order;와 C99/C11 지정 초기화자(Order o = { .orderId = "ORD-4821", ... };)를 같이 두면, 각 멤버가 자식 요소인 완전한 <Order>...</Order> 트리가 됩니다. 고정 크기 char 배열은 바이트 배열이 아니라 문자열로 다루고, 수치 타입은 리터럴 형태를 유지하며, <stdbool.h>의 bool은 출력에서 true / false로 나옵니다.
배열과 중첩 struct는 직접 손으로 썼을 법한 모양으로 나옵니다. OrderItem items[2]는 <items><OrderItem/><OrderItem/></items>가 되고 각 원소가 펼쳐집니다. 중첩 typedef는 실제 레이아웃까지 해결하므로, double의 별칭 MoneyAmount도 허공에 매달린 참조가 아니라 숫자 값으로 나옵니다. 초기화자가 없는 포인터는 조용히 버려지지 않고 빈 요소로 나옵니다 — 옛 컨슈머에게 여전히 XML을 내보내는 GCC 빌드 서비스에서 이 출력을 스키마 템플릿으로 쓰기 편합니다.
사용 방법
세 단계. typedef 하나만 붙여넣든, 헤더 전체에 초기화자를 붙이든 동작합니다.
C 붙여넣기(또는 샘플 사용)
왼쪽 에디터에 아무 C나 넣어보세요 — typedef struct, 평범한 struct, 지정 초기화자, 혹은 섞인 것. #include 지시문, 주석, #define 매크로는 그대로 둬도 괜찮습니다.
깔끔한 예제를 원하면 샘플 불러오기를 누르세요. OrderItem, Address가 중첩된 현실적인 Order typedef가 C99 지정 초기화자 문법으로 초기화되어 있습니다.
변환 누르기
녹색 변환 버튼을 클릭하세요. 도구가 struct들을 훑고 typedef를 풀며 중첩 타입과 배열을 펼쳐 한 번에 XML을 씁니다. 작업 중에는 짧은 로딩 표시가 뜹니다.
XML 복사
오른쪽 패널에 well-formed 하고 들여쓰기된 XML이 채워집니다. libxml2 테스트 픽스처, 펌웨어가 부팅 때 읽는 설정 파일, Expat 콜백 테스트, 문서 어디든 붙여 쓰세요.
정말 도움되는 순간
임베디드 / 펌웨어 설정 템플릿
부트로더나 산업 장비는 flash나 SD 카드에서 XML 설정을 읽는 경우가 많습니다. 설정을 나타내는 C struct를 붙여넣으면 레이아웃과 바이트 단위로 맞는 편집 가능한 XML 템플릿을 얻을 수 있습니다.
libxml2 / Expat 테스트 픽스처
파서 테스트마다 XML 샘플을 손으로 쓰는 건 지칩니다. 파서가 채워 넣는 실제 typedef에서 픽스처를 만들면 픽스처와 타입이 항상 맞아떨어집니다.
레거시 XML 시스템과의 대화
통신·방산·의료의 C 서비스는 여전히 파트너 시스템과 XML을 주고받습니다. 새 struct를 선에 태워야 할 때, 직렬화기를 쓰기 전에 정확한 모양을 먼저 보여줍니다.
문서와 스키마 예제
"대표적인 메시지"를 보여주는 README나 API 레퍼런스 섹션은, 실제 헤더에서 예제를 생성하면 최신 상태로 유지하기 쉽습니다. 코드가 읽는 것과 문서가 주장하는 것 사이의 드리프트가 없어집니다.
자주 묻는 질문
typedef가 여러 개 있는 헤더 전체를 붙여넣어도 되나요?
네. 전체 헤더를 붙여넣으세요 — 모든 typedef struct를 잡아내고, 중첩 타입은 인라인으로 펼치며, 전방 선언된 타입은 뒤에 정의가 나오면 그때 해결됩니다. 레이아웃 목적으로 #include, #define, 주석은 무시합니다.
C99 / C11 지정 초기화자도 이해하나요?
네. Order o = { .orderId = "ORD-4821", .items = { ... } };는 필드 이름 기준으로 파싱하므로 XML 요소 이름이 작성한 그대로 맞춰집니다. 같은 붙여넣기 안에 struct 정의가 있으면 위치 기반 집계 초기화자도 동작합니다 — 선언된 멤버 순서에 맞춰 위치를 정렬합니다. C11 표준 6.7.9절 참고.
char 배열, enum, union은 어떻게 처리하나요?
고정 크기 char 배열은 (거의 모든 실제 C 코드베이스의 관습대로) 문자열로 렌더링하며 정수 리스트로 두지 않습니다. enum 값은 숫자가 아니라 열거자 이름으로 출력해 가독성을 유지합니다. union 멤버는 지정 초기화자가 마지막에 지정한 변종이 명확하면 그 변종을 쓰고, 현재 변종이 모호하면 주석이 달린 빈 요소로 둡니다.
그냥 libxml2나 Expat을 쓰면 안 되나요?
런타임 직렬화에는 그 라이브러리들이 튼튼하지만, 첫 번째 픽스처나 첫 번째 설정 템플릿을 손으로 짜는 데는 여전히 시간이 듭니다. 이 도구가 그 시간을 아껴줍니다. XML 모양이 잡히면 프로덕션 경로는 libxml2나 Expat에 맡기면 됩니다.
붙여넣은 코드는 저장되나요?
변환을 위해 백엔드로 보내지만 저장하지는 않습니다 — 페이로드를 로그에도 남기지 않습니다. 항상 그렇듯 소스가 민감한 경우(독점 프로토콜, 안전 관련 펌웨어 등) 붙여넣기 전에 한 번 살펴보세요.
C에 포인터, 함수 포인터, 불투명 타입이 있으면요?
초기화자가 있는 객체 포인터는 그 참조 대상까지 따라갑니다. 초기화되지 않은 포인터, 함수 포인터, 정의가 보이지 않는 불투명 타입(struct Foo*)은 전체 변환을 실패시키는 대신 빈 요소로 내보냅니다. 포인터 대상이 직렬화 페이로드에 포함되지 않는 struct에 대해 XML을 손으로 쓸 때의 방식과 동일합니다.
함께 쓰면 좋은 도구
C to XML은 퍼즐의 한 조각일 뿐입니다. 다음 도구들과 잘 어울립니다: