Objective-C to XML 변환기
Objective-C 인터페이스나 객체를 붙여 넣으세요. 깔끔한 XML이 돌아옵니다.
이 도구가 하는 일
낡은 SOAP 서비스, plist 파일, Cocoa 설정, 테스트 픽스처처럼 Objective-C 모델에 맞는 XML 페이로드를 직접 만들어 본 적이 있다면 그 수고를 잘 아실 겁니다. @property 줄을 세고, 타입 한정자를 떼어내고, 어느 것이 NSArray 컨테이너인지 기억해 내면서 모양이 맞기를 기도하죠. 여기에 Objective-C를 붙여 넣으면 잘 형성된 XML이 한 번에 돌아옵니다. 짧은 alloc/init 스니펫이든, 여러 @interface 블록이 있는 헤더 파일 전체든, 깊게 중첩된 모델이든 결과는 같습니다.
단순 텍스트 치환이 아닙니다. 이 변환기는 Cocoa가 실제로 XML에 매핑되는 방식을 따라갑니다. NSString 값은 텍스트 노드가 되고(올바르게 이스케이프됩니다), NSNumber와 NSDecimalNumber는 래퍼를 벗고 평범한 숫자 텍스트가 됩니다 — 즉 [NSDecimalNumber decimalNumberWithString:@"249.99"]는 249.99로 나옵니다. BOOL 값은 true / false 또는 스키마가 필요로 하면 YES / NO가 됩니다. NSArray<OrderItem *>는 요소 타입 이름을 딴 자식을 아이템별로 하나씩 가진 컨테이너 요소가 됩니다 — NSXMLElement 트리가 만드는 것과 같은 모양입니다.
인스턴스 변수 백킹도 처리됩니다. @property가 @synthesize customerName = _customerName;을 쓰더라도 요소 이름은 여전히 _customerName이 아닌 customerName입니다 — iVar 이름은 구현 세부일 뿐 와이어 포맷의 일부가 아닙니다. 중첩 객체(Order 안에 Address @property가 있는 경우)는 그 자리에서 펼쳐지고, nil 값은 빈 요소가 되어 모양을 일관되게 유지합니다. 여러 @interface 블록을 붙여 넣으면 전부 출력에 담깁니다. .h 파일에 있는 모습 그대로 붙여 넣어도 됩니다 — 정리할 필요 없습니다 — 그리고 결과를 NSXMLDocument가 만들어 낼 것과 비교해 보세요.
사용 방법
세 단계. 클래스 하나를 붙여 넣든 헤더 한 묶음을 붙여 넣든 동일하게 동작합니다.
Objective-C 붙여 넣기(또는 샘플 사용)
Objective-C를 왼쪽 편집기에 그대로 넣으세요. @interface 블록, alloc/init 객체 리터럴, 여러 클래스, 중첩 타입 — 모두 괜찮습니다. 먼저 샘플 불러오기를 눌러 Order / OrderItem / Address의 현실적인 예를 확인해 보세요.
@property 속성을 떼어내거나, pragma를 제거하거나, import 문을 정리할 필요는 없습니다. Xcode에서 보이는 그대로 두면 됩니다. 파서는 실제 .h나 .m 파일 읽는 법을 압니다.
변환 누르기
녹색 변환 버튼을 누르세요. 도구는 Objective-C를 읽고, 모든 @property를 유지하고, 중첩 객체를 보존하면서 한 번에 XML을 만듭니다. 처리 중에는 짧은 로딩 표시가 뜹니다.
XML 복사
오른쪽 패널이 들여쓰기된 잘 형성된 XML로 채워지며 — NSXMLParser를 포함해 — 표준을 따르는 어떤 파서든 받아들입니다. plist, SOAP 요청 본문, 테스트 픽스처, 또는 문서에 복사해서 쓰세요.
실제로 유용한 순간
iOS plist 픽스처 만들기
Objective-C 모델이 있고 그에 맞는 Info.plist나 데이터 시드 plist가 필요할 때. 클래스를 붙여 넣고, XML을 받아서 번들에 넣으면 됩니다 — <code><dict></code> / <code><key></code> 쌍을 손으로 쓰지 않아도 됩니다.
Cocoa XML 설정 파일
오래된 데스크톱 Cocoa 앱은 여전히 XML 설정을 사용합니다. <code>Settings</code> 클래스를 바로 편집할 수 있는 템플릿으로 바꿔, 설정이 그걸 읽는 코드와 일치하도록 하세요.
iOS의 레거시 SOAP / WCF 클라이언트
iOS 앱이 여전히 SOAP 엔드포인트와 통신한다면 요청 계약 클래스를 붙여 넣고 XML 엔벨로프 본문을 받아 오세요 — <code>NSXMLElement</code> 트리를 손으로 만드는 것보다 쉽습니다.
Mac OS XML 워크플로우에 투입
오래된 AppleScript / Automator / XML-RPC 연동은 XML을 요구합니다. Objective-C 모델을 붙여 넣고 XML을 받아 워크플로우에 흘려 보내세요 — 수동 변환이 필요 없습니다.
자주 묻는 질문
@interface 선언을 한 번에 여러 개 붙여 넣을 수 있나요?
네. 헤더 파일 전체를 붙여 넣으셔도 됩니다. 각 @interface는 중첩 타입이 펼쳐진 상태로 처리됩니다. @interface가 ({ } 안에서) ivar를 명시적으로 선언하든, 모던한 @property만 쓰는 스타일이든 동일하게 동작합니다.
@property 속성은 어떻게 처리되나요?
(nonatomic, copy), (strong), (weak), (readonly), (assign) 같은 속성은 런타임용 메타데이터로, 직렬화된 모양을 바꾸지 않습니다. 요소 이름은 프로퍼티 이름입니다. readonly 프로퍼티도 값을 가지므로 그대로 출력됩니다. 커스텀 게터로 만든 계산 프로퍼티도 다른 프로퍼티와 똑같이 다뤄집니다.
iVar 이름은요 — _언더스코어 요소가 나오나요?
아니요. 프로퍼티가 customerName이고 백킹 iVar가 _customerName이라면 XML 요소는 <customerName>입니다. 언더스코어는 Objective-C의 관례일 뿐 와이어 포맷이 아닙니다. 요소 이름을 바꾸고 싶다면 @property 자체를 바꾸고 다시 붙여 넣으세요.
NSString, NSNumber, NSDecimalNumber, BOOL, NSDate는 어떻게 처리되나요?
NSString은 적절히 XML 이스케이프된 텍스트 노드가 됩니다. NSNumber와 NSDecimalNumber는 래퍼를 벗고 평범한 숫자 텍스트가 됩니다. BOOL은 true / false(소스 코드가 plist 관례를 쓰면 YES / NO)가 됩니다. NSDate는 ISO-8601 문자열로 나옵니다. nil 값은 삭제되는 대신 빈 요소가 됩니다.
NSArray, NSDictionary, 중첩 객체는요?
NSArray<OrderItem *>는 요소 타입 이름을 딴 자식을 아이템마다 하나씩 가진 컨테이너 요소가 됩니다: <items><OrderItem/><OrderItem/></items>. NSDictionary는 <entry><key/><value/></entry>의 컨테이너가 됩니다. 중첩 객체(타입이 또 다른 @interface인 프로퍼티)는 모든 필드를 유지한 채 그 자리에서 펼쳐집니다.
제 코드가 저장되나요?
코드는 변환을 위해 백엔드로 전송되지만 보관되지는 않습니다 — 페이로드를 기록하지 않습니다. 온라인 도구가 늘 그렇듯, 정말 민감한 코드라면 붙여 넣기 전에 한 번 살펴보세요.
함께 쓰면 좋은 도구
Objective-C to XML은 퍼즐의 한 조각일 뿐입니다. 이 도구들과 잘 어울립니다: