Perl to XML 변환기
Perl 패키지나 데이터 구조를 붙여넣으세요. 깔끔한 XML이 돌아옵니다.
이 도구가 하는 일
어딘가에 XML을 보내는 Perl을 운영해 봤다면 — 오래된 SOAP 서비스, XML 기반 설정, CPAN 중심 연동이든 — 그 루틴이 익숙할 겁니다. use XML::Simple, ForceArray와 KeyAttr 만지작거리기, 직접 해시 레퍼런스 만들고, 결과가 받는 쪽이 원하는 모양이기를 기도하기. Perl을 여기에 붙여넣으면 단번에 잘 구성된 XML을 돌려받습니다 — bless된 객체든, 순수 해시 레퍼런스든, 생성자와 접근자까지 달린 패키지 전체든 상관없습니다.
변환기는 Perl의 흔한 OO 패턴을 깔끔하게 읽습니다. 해시 레퍼런스로 bless $self, $class를 하는 생성자는 하위 요소가 해시 키를 그대로 반영하는 XML 요소가 됩니다. 배열 레퍼런스는 항목 하나당 자식 하나를 갖는 컨테이너 요소로 바뀝니다(자식 태그는 기본적으로 키의 단수형이라서 items => [...]는 <items><item/>...</items>가 됩니다). 중첩된 해시 레퍼런스는 중첩된 요소가 됩니다. undef는 버려지지 않고 빈 요소가 되므로, XML::Simple이나 XML::LibXML이 round-trip할 때의 모양과 일치합니다.
여러 package 블록을 한 번에 붙여넣어도 됩니다 — package Order; package OrderItem; package Address; 같은 식으로요. 각 패키지마다 생성자에서 할당된 필드들이 풀린 상태로 나옵니다. OO가 아닌 평범한 데이터 구조도 동작합니다. my $data = { ... };를 넣으면 도구가 레퍼런스를 따라가면서 해시 키를 요소 이름으로 보존합니다. 이 뒤에 있는 더 깊은 Perl 규칙은 공식 perldoc가 기준입니다.
사용 방법
세 단계면 됩니다. 열 줄짜리 패키지를 붙이든 헬퍼까지 포함된 모듈을 통째로 붙이든 흐름은 동일합니다.
Perl을 붙여넣거나 샘플 불러오기
왼쪽 에디터에 코드를 있는 그대로 넣으세요. 생성자를 가진 package, 평범한 해시 레퍼런스, 중첩 패키지, 혹은 섞인 것 — 다 괜찮습니다. 먼저 샘플 불러오기를 눌러 실제 같은 예시부터 보셔도 됩니다.
use strict;, use warnings;, require 목록을 굳이 지울 필요 없습니다. 에디터에서 보이는 그대로 두세요. 그냥 붙여넣으면 됩니다.
변환 누르기
초록색 변환 버튼을 누르세요. 도구가 패키지 선언을 읽고, bless된 참조를 풀고, 한 번에 XML을 만듭니다. 작업 중에는 잠깐 로딩 표시가 나옵니다.
XML 복사
오른쪽 패널에 들여쓰기된 잘 구성된 XML이 채워집니다. 표준을 따르는 어떤 파서도 받아들일 수 있는 형식입니다. CPAN 워크플로, 레거시 SOAP 연동, XML 기반 설정 파일, 테스트 픽스처로 바로 복사해 넣으세요.
실제로 쓸 만한 상황
XML::LibXML이나 XML::Simple에 넘기기 전
Perl 데이터 구조가 있고 <code>XMLout</code> / <code>XML::LibXML::Document</code>를 연결하기 전에 XML로는 정확히 어떤 모양인지 보고 싶을 때. 붙이고, 변환하고, 복사하고, 비교하면 됩니다.
레거시 시스템 연동
CPAN 기반 연동이 여전히 SOAP 1.1이나 전용 XML 포맷을 원하는 경우. Perl 표현을 붙여넣으면 SoapUI나 curl에 던질 만한 현실적인 바디가 나옵니다.
Perl에서 벗어나기
오래된 Perl 서비스를 다른 걸로 교체 중이라면, 데이터의 모양을 먼저 XML로 뽑아두세요 — Python, Java, C#로 옮기기 위한 중립 지대가 됩니다.
코드와 맞는 문서
실제 패키지에서 바로 <a href="https://metacpan.org/" target="_blank" rel="noopener">MetaCPAN</a> 모듈 README나 사내 위키용 XML 예시를 뽑으세요. 그래야 문서가 코드와 어긋나지 않습니다.
자주 묻는 질문
패키지 여러 개를 한꺼번에 붙여도 되나요?
네 — .pm 파일 전체, 혹은 여러 개의 package 블록을 붙여넣어도 됩니다. 각 패키지마다 생성자에서 할당된 해시 키가 풀려서 나오고, 중첩된 객체 참조도 해소됩니다. Order가 OrderItem 객체 배열 레퍼런스와 shipping_address 해시 레퍼런스를 가지고 있다면, 세 개 모두 출력에 나타납니다.
undef나 없는 키는 어떻게 처리되나요?
값이 undef인 키는 빈 요소가 됩니다. 인스턴스끼리 XML 모양이 달라지지 않게 하려는 겁니다. 해시에 아예 없는 키는 생략됩니다. 빈 배열을 담은 배열 레퍼런스는 버려지지 않고 빈 컨테이너 요소(<items></items>)가 됩니다.
배열 레퍼런스와 해시 레퍼런스는 똑같이 동작하나요?
배열 레퍼런스는 항목 하나당 자식 하나를 갖는 컨테이너 요소가 됩니다 — 기본적으로 자식 태그는 키의 단수형이라 items => [...]는 <items><item/>...</items>가 됩니다. 해시 레퍼런스는 키를 그대로 반영한 자식들을 갖는 중첩 요소가 됩니다. 혼합된 레퍼런스(해시의 배열, 배열의 해시)도 같은 규칙으로 재귀적으로 중첩됩니다.
bless된 참조와 다중 상속은 어떻게 되나요?
bless된 참조는 클래스 이름을 들고 있어서, 적절할 때 요소 태그로 쓸 수 있습니다. @ISA나 Moose/Moo 롤로 이루어진 다중 상속의 경우 최종적으로 구성된 객체의 속성들이 그대로 나옵니다. 상속 그래프 자체를 XML로 재구성하지는 않습니다.
제 코드가 저장되나요?
변환을 위해 백엔드로 보내지만, 저장하지 않습니다 — 페이로드를 기록하지도 않습니다. Perl에 민감한 정보가 들어 있다면(리터럴 자격증명, 내부 URL) 다른 온라인 도구와 마찬가지로 붙여넣기 전에 한 번 훑어봐 주세요.
Perl이 서브루틴 레퍼런스나 tie를 쓰면요?
코드 레퍼런스와 tied 변수는 변환 전체를 실패시키지 않고 빈 요소로 내보냅니다. 구조의 데이터 부분은 제대로 나옵니다. 코드 자체에 문법 오류가 있다면, 먼저 눈에 띄는 것들만 고쳐서 파서가 읽을 만한 상태로 만들어 주세요.
같이 쓰면 좋은 도구
Perl to XML은 퍼즐의 한 조각입니다. 이 도구들과 잘 어울립니다: