이 CSV XML 변환기는 CSV나 TSV의 행으로 UTF-8 XML 문서를 만듭니다. 루트 요소와 행 요소의 이름을 정하면 각 열이 모든 행 안에서 헤더 이름을 딴 자식 요소가 됩니다. XML만 받는 레거시 시스템에 데이터를 넣거나, XSLT·XPath 테스트용 데이터를 만들거나, 이미 XML 기반인 도구 체인으로 스프레드시트를 옮길 때 쓰기 좋습니다.
열 헤더는 자유 텍스트지만 XML 요소 이름은 그렇지 않아서 Unit Price나 1st place 같은 헤더는 고쳐야 합니다. 변환기는 이미 유효한 이름인 헤더를 id2, unit-price까지 포함해 적힌 그대로 쓰고, 이름에 쓸 수 없는 문자만 인코딩합니다. 텍스트는 이스케이프되고, 빈 셀과 null 단어는 <note/> 같은 빈 요소가 되며, ‘숫자·불리언·null 감지’가 켜져 있으면 숫자 열은 정규화된 형태로 쓰입니다.
문서는 파싱된 행으로 브라우저 안에서 조립되며, 입력한 내용은 서버로 전송되지 않습니다. 입력 한도는 20 MiB, 데이터 행 50,000개, 열 200개입니다.
사용 방법
CSV 불러오기
텍스트를 붙여 넣거나 .csv, .tsv 파일을 끌어다 놓거나 예제를 고릅니다. RFC 4180을 따르므로 따옴표로 감싼 셀에 쉼표, 두 번 쓴 따옴표, 줄바꿈이 들어갈 수 있고, Excel이 첫 줄에 붙이는
sep=;도 반영합니다.읽기 옵션 확인
‘구분자’는 처음에 ‘자동 감지’로, 앞쪽 레코드들에서 쉼표, 세미콜론, 탭, 파이프를 비교해 고릅니다. ‘첫 행은 헤더’가 요소 이름을 정하며, 끄면 열 이름이 column_1, column_2 식으로 붙습니다. ‘빈 줄 건너뛰기’는 빈 줄을 버려 뒤 레코드가 밀리지 않게 합니다.
루트·행 요소 이름 정하기
‘루트 요소’ 기본값은 rows, ‘행 요소’ 기본값은 row입니다. people과 person처럼 가져올 시스템이 기대하는 이름을 입력하세요. 둘 다 문자나 밑줄로 시작하고 공백이 없어야 하며 대소문자와 관계없이 xml로 시작하면 안 됩니다. 어기면 오류 메시지가 규칙을 알려 줍니다.
값 처리와 형식 고르기
‘숫자·불리언·null 감지’에 따라
4.50이 그대로 남을지4.5가 될지,NA가 빈 요소가 될지가 정해집니다. ‘들여쓰기’는 공백 2칸, 공백 4칸, 탭 중에서 고르고, 결과를 다른 문서 안에 붙여 넣을 때는 ‘XML 선언’을 끄세요.복사 또는 다운로드
이름이 바뀌었거나 셀 수가 다른 열에 대한 안내를 확인한 뒤 XML을 복사하거나 data.xml로 내려받습니다. ‘파일을 읽은 결과’ 패널에서 앞쪽 행과 열마다 정해진 타입을 볼 수 있습니다.
작동 원리
XML 1.0의 요소 이름 규칙
XML 1.0의 이름은 문자나 밑줄로 시작하고 문자, 숫자, 하이픈, 밑줄, 마침표가 이어집니다. 공백은 쓸 수 없고 대소문자와 관계없이 xml로 시작하는 이름은 예약되어 있습니다. 이 규칙을 이미 지키는 헤더는 그대로 씁니다. 그렇지 않은 헤더에서는 이름에 쓸 수 없는 문자 하나하나를 _x, 16진수 코드 포인트, 밑줄로 바꿉니다. 공백은 _x20_, &는 _x26_이 됩니다. 그래도 숫자, 마침표, 하이픈, xml로 시작하는 이름에는 앞에 밑줄을 붙입니다.
ASCII 밖의 문자도 XML 이름에 쓸 수 있으므로 größe나 prénom은 그대로 남습니다. 빈 헤더는 위치에 따라 column_3 같은 이름을 받고 반복된 헤더에는 _2, _3이 붙어, 한 행 안의 자식 요소 이름이 모두 달라집니다.
| 헤더 | 요소 이름 |
|---|---|
| Unit Price | Unit_x20_Price |
| 1st place | _1st_x20_place |
| xmlid | _xmlid |
| a&b | a_x26_b |
| id2 | id2 |
| unit-price | unit-price |
| größe | größe |
이스케이프와 금지 문자
요소 텍스트 안의 &, <, >는 &, <, >로 바뀝니다. 요소 내용에 필요한 이스케이프는 이것이 전부입니다. 속성을 쓰지 않으므로 큰따옴표와 아포스트로피는 그대로 둡니다. 그래서 <b>가 든 셀은 마크업이 아니라 텍스트로 나타나고, 따옴표로 감싼 CSV 셀 안의 줄바꿈은 요소 텍스트 안에서도 줄바꿈으로 남습니다.
XML 1.0은 U+0001이나 수직 탭 같은 대부분의 제어 문자를 문자 참조로도 허용하지 않습니다. 변환기는 그런 문자를 U+FFFD로 바꾸고 개수를 안내에 표시하므로 문서는 항상 파싱됩니다.
빈 셀, null 단어, 숫자 형식
‘숫자·불리언·null 감지’가 켜져 있으면 빈 셀과 ‘null로 볼 단어’(기본값 NA, N/A, null, none, undefined)는 <note/> 같은 스스로 닫는 요소가 됩니다. 채워진 셀이 모두 평범한 숫자인 열은 정규화된 형태로 쓰여 4.50은 4.5, 1e3은 1000이 되지만, 앞자리 0이 있으면 열 전체가 텍스트로 남아 001이 지켜집니다. XML 자체에는 타입이 없으므로 달라지는 것은 텍스트의 모양뿐입니다.
감지를 끄면 모든 셀을 그대로 복사합니다. 빈 셀은 <note></note>, NA는 NA로 남고 4.50의 끝자리 0도 유지됩니다. 어느 쪽이든 셀이 모자란 레코드에는 빠진 열만큼 빈 요소가 들어가고, 남는 셀은 column_N 요소가 되며, 셀 수가 다른 레코드 수가 안내에 표시됩니다.
실제 예시
id,name,price,active,note
001,Ari,4.50,true,NA
002,Bea,12,false,Gift wrap<?xml version="1.0" encoding="UTF-8"?>
<rows>
<row>
<id>001</id>
<name>Ari</name>
<price>4.5</price>
<active>true</active>
<note/>
</row>
<row>
<id>002</id>
<name>Bea</name>
<price>12</price>
<active>false</active>
<note>Gift wrap</note>
</row>
</rows>기본 옵션입니다. id는 앞자리 0이 있어 텍스트로 남고 안내에 표시됩니다. price는 숫자 열이라 4.50이 4.5로 쓰였고, NA는 빈 요소 <note/>가 됐습니다.
1st place,Unit Price,xmlid,a&b,id2
5,<b>,x,"q'",7<?xml version="1.0" encoding="UTF-8"?>
<people>
<person>
<_1st_x20_place>5</_1st_x20_place>
<Unit_x20_Price><b></Unit_x20_Price>
<_xmlid>x</_xmlid>
<a_x26_b>q'</a_x26_b>
<id2>7</id2>
</person>
</people>루트 요소 people, 행 요소 person입니다. 공백, 앰퍼샌드, 맨 앞 숫자, xml 접두사만 바뀌었고 id2는 이미 유효한 이름이라 그대로입니다. 셀의 <b>는 텍스트로 이스케이프됐습니다.
id,id,,city
1,2,3,Seoul
4<rows>
<row>
<id>1</id>
<id_2>2</id_2>
<column_3>3</column_3>
<city>Seoul</city>
</row>
<row>
<id>4</id>
<id_2/>
<column_3/>
<city/>
</row>
</rows>‘XML 선언’을 끈 상태입니다. 두 번째 id는 id_2, 빈 헤더는 column_3이 됐습니다. 짧은 두 번째 레코드에는 빠진 셀만큼 스스로 닫는 요소가 들어가고, 셀 수가 다른 레코드와 이름이 바뀐 열이 안내에 표시됩니다.
sku,price,note
A-1,4.50,
B-2,12,NA<?xml version="1.0" encoding="UTF-8"?>
<rows>
<row>
<sku>A-1</sku>
<price>4.50</price>
<note></note>
</row>
<row>
<sku>B-2</sku>
<price>12</price>
<note>NA</note>
</row>
</rows>‘숫자·불리언·null 감지’를 끄고 ‘들여쓰기’를 공백 4칸으로 둔 결과입니다. 4.50은 끝자리 0을 지키고, 빈 셀은 <note></note>, NA는 평범한 텍스트입니다.
자주 하는 실수
인코딩된 이름이 스키마와 맞지 않음
Order ID는Order_x20_ID가 되므로OrderID나order_id를 기대하는 가져오기 도구는 이 요소를 찾지 못합니다. 변환 전에 CSV 헤더를 대상 스키마가 쓰는 요소 이름 그대로 바꾸세요.숫자의 표기 형식이 바뀜
감지가 켜져 있으면
4.50은4.5,1e3은1000으로 쓰입니다. 소수 둘째 자리까지 유지해야 하는 가격처럼 받는 쪽이 텍스트로 비교한다면 ‘숫자·불리언·null 감지’를 꺼서 모든 셀을 적힌 그대로 복사하세요.빈 요소와 타입이 있는 스키마
모든 행에 모든 열이 들어가므로 값이 없으면 요소가 빠지는 대신 빈 요소가 됩니다.
price를xs:decimal로 정의한 XSD는 빈 문자열이 소수가 아니어서<price/>를 거부합니다. 스키마가 엄격하다면 XSLT로 빈 요소를 지우거나 요소를 nillable로 정의하세요.속성과 중첩은 만들지 않음
각 열은 텍스트 내용을 가진 자식 요소입니다. 열을 속성으로 쓰거나 여러 열을 중첩 요소로 묶는 방법은 없습니다. 대상 형식이
<row id="1">같은 모양을 원하면 XSLT나 스크립트로 후처리하세요.텍스트 셀의 공백 유지
텍스트 셀은 앞뒤 공백을 다듬지 않으므로
Ari의 앞 공백이 요소 안에 그대로 남고, 받는 쪽은 이를 의미 있는 값으로 볼 수 있습니다. 문제가 된다면 CSV를 먼저 정리하세요.
자주 묻는 질문
루트와 행 요소 이름을 정할 수 있나요?
네. ‘루트 요소’ 기본값은 rows, ‘행 요소’ 기본값은 row입니다. 둘 다 xml로 시작하지 않는 유효한 XML 이름이어야 하며, 그렇지 않으면 결과 대신 오류가 표시됩니다.
&나 < 같은 특수문자는 어떻게 처리되나요?
요소 텍스트 안의 &, <, >는 &, <, >로 이스케이프됩니다. 큰따옴표와 아포스트로피는 요소 내용에서 유효하므로 그대로 둡니다. XML 1.0이 금지하는 제어 문자는 U+FFFD로 바꾸고 안내에 표시합니다.
공백이나 기호가 든 헤더는 어떻게 되나요?
XML 이름에 쓸 수 없는 문자는 _x, 16진수 코드, 밑줄로 바뀌어 Unit Price는 Unit_x20_Price가 됩니다. id2나 unit-price처럼 숫자, 마침표, 하이픈이 들어 있어도 이미 유효한 이름이면 정확히 그대로 남습니다.
NA가 왜 빈 요소가 됐나요?
NA는 ‘null로 볼 단어’의 기본 목록에 들어 있고, null 값은 스스로 닫는 요소로 쓰이기 때문입니다. 텍스트로 남기려면 목록에서 NA를 지우거나, 모든 셀을 그대로 복사하도록 ‘숫자·불리언·null 감지’를 끄세요.
XML 선언이 붙나요?
기본으로 첫 줄은 <?xml version="1.0" encoding="UTF-8"?>이고 내려받는 파일도 UTF-8입니다. 결과를 기존 문서 안에 붙여 넣을 때는 ‘XML 선언’을 끄세요.
CSV가 서버로 전송되나요?
아니요. 입력한 내용은 브라우저 안에서 처리되며 서버로 전송되지 않습니다. XML은 페이지에 표시되고 거기서 복사하거나 내려받습니다.
마지막 업데이트:
