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

이 도구가 하는 일

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 하나만 붙여넣든, 헤더 전체에 초기화자를 붙이든 동작합니다.

1

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

왼쪽 에디터에 아무 C나 넣어보세요 — typedef struct, 평범한 struct, 지정 초기화자, 혹은 섞인 것. #include 지시문, 주석, #define 매크로는 그대로 둬도 괜찮습니다.

깔끔한 예제를 원하면 샘플 불러오기를 누르세요. OrderItem, Address가 중첩된 현실적인 Order typedef가 C99 지정 초기화자 문법으로 초기화되어 있습니다.

2

변환 누르기

녹색 변환 버튼을 클릭하세요. 도구가 struct들을 훑고 typedef를 풀며 중첩 타입과 배열을 펼쳐 한 번에 XML을 씁니다. 작업 중에는 짧은 로딩 표시가 뜹니다.

3

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 모양이 잡히면 프로덕션 경로는 libxml2Expat에 맡기면 됩니다.

붙여넣은 코드는 저장되나요?

변환을 위해 백엔드로 보내지만 저장하지는 않습니다 — 페이로드를 로그에도 남기지 않습니다. 항상 그렇듯 소스가 민감한 경우(독점 프로토콜, 안전 관련 펌웨어 등) 붙여넣기 전에 한 번 살펴보세요.

C에 포인터, 함수 포인터, 불투명 타입이 있으면요?

초기화자가 있는 객체 포인터는 그 참조 대상까지 따라갑니다. 초기화되지 않은 포인터, 함수 포인터, 정의가 보이지 않는 불투명 타입(struct Foo*)은 전체 변환을 실패시키는 대신 빈 요소로 내보냅니다. 포인터 대상이 직렬화 페이로드에 포함되지 않는 struct에 대해 XML을 손으로 쓸 때의 방식과 동일합니다.

함께 쓰면 좋은 도구

C to XML은 퍼즐의 한 조각일 뿐입니다. 다음 도구들과 잘 어울립니다: