C# to XML 변환기
C# 클래스나 객체를 붙여 넣으면 깔끔한 XML이 나옵니다.
이 도구가 하는 일
SOAP 호출, 설정 파일, WCF 컨트랙트, 테스트 픽스처 때문에 C# 클래스와 똑같은 모양의 XML 페이로드를 손으로 만들어 본 적이 있다면 얼마나 성가신 일인지 아실 겁니다. 여기에 C# 코드를 붙여 넣기만 하면 잘 만들어진 XML이 한 번에 나옵니다. 객체 이니셜라이저 하나든, 여러 클래스가 들어 있는 모델 파일 전체든, 깊게 중첩된 구조든 결과는 같습니다. 모든 프로퍼티가 보존된 완전한 XML 문서가 나옵니다.
단순한 문자열 치환이 아닙니다. 이 변환기는 C#이 실제로 XML로 어떻게 직렬화되는지 이해합니다. 49.99m 같은 decimal 접미사는 m이 떨어지고, DateTime과 DateTimeOffset은 ISO-8601 문자열로 나옵니다. Guid는 표준 8-4-4-4-12 16진 문자열이 되고, null 값을 가진 nullable은 빈 요소가 됩니다. 컬렉션은 XmlSerializer가 만들어낼 형태를 그대로 따릅니다 — 각 List<T>는 요소 타입 이름을 가진 자식 하나씩을 담은 컨테이너 요소가 됩니다.
직렬화 어트리뷰트도 존중합니다. [XmlRoot("x")]은 루트 요소 이름을 바꾸고, [XmlElement("x")]은 자식 요소 이름을, [XmlAttribute("x")]은 프로퍼티를 요소 대신 속성으로 내보내고, [XmlIgnore]은 제외합니다. DataContract 클래스의 [DataMember(Name="x")]도 같은 방식으로 동작합니다. 여러 클래스를 붙여 넣으면 각 클래스가 출력에 나오고, 중첩 타입은 풀어지고 상속 프로퍼티도 포함됩니다. 조용히 사라지는 건 없습니다.
사용 방법
세 단계면 됩니다. 다섯 줄이든 모델 파일 전체든 똑같이 동작합니다.
C# 코드 붙여 넣기 (샘플을 써봐도 좋습니다)
왼쪽 편집기에 C# 코드를 그대로 붙여 넣으세요. 객체 이니셜라이저, 완전한 클래스 정의, 여러 클래스, 중첩 타입 모두 괜찮습니다. 실제 예시를 먼저 보고 싶다면 Load Sample을 눌러 보세요.
주석을 지우거나 어트리뷰트를 제거하거나 C# 문법을 다듬을 필요 없습니다. IDE에 보이는 그대로 두고 붙여 넣으면 됩니다.
Convert 누르기
초록색 Convert 버튼을 누르세요. 도구가 C# 코드를 읽어 모든 클래스와 프로퍼티를 유지하며 한 번에 XML을 만들어냅니다. 동작하는 동안 짧은 로딩 표시가 보입니다.
XML 복사
오른쪽 패널에 들여쓰기된, 표준을 따르는 XML 파서가 받아들일 수 있는 잘 만들어진 XML이 채워집니다. 그대로 복사해서 SOAP 요청, 설정 파일, 테스트 픽스처, 문서에 붙여 넣으면 됩니다.
실제로 쓸모 있는 순간들
SOAP / WCF 픽스처 만들기
C# 요청 컨트랙트가 있고 SoapUI나 Postman에 넣을 XML 바디가 필요할 때. 클래스를 붙여 넣고 XML을 받아 바로 쓰면 됩니다.
설정 파일 초안 잡기
프로퍼티 40개짜리 Settings 클래스가 app.config, web.config, 혹은 XML 기반 설정 저장소에 바로 넣을 수 있는 XML 템플릿이 됩니다. 손으로 쓰는 보일러플레이트는 끝입니다.
문서와 코드 동기화
실제 모델에서 바로 XML 예시를 뽑아 README, API 레퍼런스, XSD 기반 스키마 문서에 넣을 수 있습니다. 문서가 코드와 어긋날 일이 없습니다.
테스트 데이터 시드
유닛 테스트의 객체 이니셜라이저를 XML 시드 파일로 바꿔 통합 테스트, 목 서버, 아직 XML을 쓰는 레거시 시스템에 활용할 수 있습니다.
자주 묻는 질문
클래스 여러 개를 한 번에 붙여 넣어도 되나요?
네, 파일 전체를 붙여 넣어도 됩니다. 최상위 클래스마다 중첩 타입이 풀어지고 베이스 클래스에서 상속받은 프로퍼티가 포함된 상태로 나옵니다. 빠지는 건 없습니다.
[XmlElement], [XmlAttribute], [XmlIgnore] 같은 어트리뷰트를 지원하나요?
네. [XmlRoot("x")]은 루트 요소 이름을 바꾸고, [XmlElement("x")]은 자식 요소 이름을 바꾸며, [XmlAttribute("x")]은 프로퍼티를 부모의 속성으로 내보내고, [XmlIgnore]은 아예 제외합니다. DataContract 클래스의 [DataMember(Name="x")]도 요소 이름을 바꿉니다. XmlSerializer와 같은 동작입니다.
decimal, DateTime, Guid, nullable은 어떻게 처리하나요?
decimal(49.99m)은 접미사가 빠지면서 그냥 숫자 텍스트가 됩니다. DateTime과 DateTimeOffset은 ISO-8601 문자열로 나옵니다. Guid는 표준 8-4-4-4-12 16진 문자열입니다. TimeSpan은 ISO-8601 기간이나 HH:mm:ss가 됩니다. null 값을 가진 nullable은 제거되지 않고 빈 요소로 나오기 때문에 구조가 일관되게 유지됩니다.
중첩 클래스, List, Dictionary는요?
List<T>, 배열, HashSet<T>, IEnumerable<T>은 모두 요소 타입 이름을 가진 자식 하나씩을 담은 컨테이너 요소가 됩니다 — List<OrderItem> Items는 <Items><OrderItem/><OrderItem/></Items>로 바뀝니다. Dictionary<K,V>는 <Entry><Key/><Value/></Entry> 컨테이너가 됩니다. 중첩된 객체 이니셜라이저는 모든 필드를 그대로 유지한 채 중첩 요소로 풀어집니다.
제 코드가 저장되나요?
변환을 위해 백엔드로 전송되지만 저장하지 않습니다. 페이로드를 로그에 남기지 않습니다. 온라인 도구를 쓸 때 늘 그렇듯, 정말 민감한 코드라면 붙여 넣기 전에 한 번 확인해 보세요.
C# 코드에 메서드, 델리게이트, IntPtr 같은 특이한 게 있으면요?
그런 것들은 변환 전체를 실패시키지 않고 빈 요소로 나옵니다. 모델의 나머지 부분은 정상적으로 나온다는 뜻입니다. 코드 자체에 문법 오류가 있다면 눈에 띄는 것부터 먼저 고치세요. 파서가 관대하긴 해도 만능은 아닙니다.
함께 쓰면 좋은 도구들
C# to XML은 퍼즐의 한 조각일 뿐입니다. 같이 쓰면 좋은 도구들을 모았습니다.