MYMONDAY.ai
서비스스튜디오도구데이터·포맷73CSS 생성기19색상·이미지10인코딩·보안10웹·SEO11개발·데브옵스10파일·내보내기18계산기6가이드

CSV XML 변환기

스프레드시트 행을 행마다 요소 하나, 열마다 자식 요소 하나인 XML 문서로 바꿉니다.

  • 브라우저에서 처리
  • 가입 없음
  • 무료

도구 작업 공간

예제

옵션

끄면 열 이름이 column_1, column_2 …가 되고 JSON은 배열이 됩니다.

비어 있거나 구분자만 있는 줄을 버려서 뒤 레코드가 밀리지 않게 합니다.

채워진 셀이 모두 맞을 때만 열이 숫자·불리언이 됩니다. 01234나 20자리 ID는 텍스트로 남습니다. 끄면 모든 셀이 적은 그대로 텍스트입니다.

대소문자 구분 없이 쉼표로 구분합니다. 빈 셀은 항상 null입니다.

들여쓰기

CSV 입력

6줄181byte구분자: 쉼표 (자동 감지)

결과

⌘/Ctrl + Enter로 복사
결과 · data.xml
<?xml version="1.0" encoding="UTF-8"?>
<rows>
  <row>
    <id>1001</id>
    <customer>Ada Lovelace</customer>
    <total>87.9</total>
    <paid>true</paid>
    <note>Gift wrap, please</note>
    <shipped>2026-03-14</shipped>
  </row>
  <row>
    <id>1002</id>
    <customer>Grace Hopper</customer>
    <total>19</total>
    <paid>false</paid>
    <note/>
    <shipped>2026-03-15</shipped>
  </row>
  <row>
    <id>1003</id>
    <customer>Linus</customer>
    <total>1200.5</total>
    <paid>true</paid>
    <note>Line one
line two</note>
    <shipped/>
  </row>
</rows>
행3
열6
요소22
크기570byte

파일을 읽은 결과

변환기가 보는 앞쪽 레코드와 열마다 정해진 타입입니다.

줄id숫자customer텍스트total숫자paid불리언note텍스트shipped텍스트
21001Ada Lovelace87.90trueGift wrap, please2026-03-14
31002Grace Hopper19falseNA2026-03-15
41003Linus1200.5trueLine one line two·

이 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개입니다.

사용 방법

  1. CSV 불러오기

    텍스트를 붙여 넣거나 .csv, .tsv 파일을 끌어다 놓거나 예제를 고릅니다. RFC 4180을 따르므로 따옴표로 감싼 셀에 쉼표, 두 번 쓴 따옴표, 줄바꿈이 들어갈 수 있고, Excel이 첫 줄에 붙이는 sep=;도 반영합니다.

  2. 읽기 옵션 확인

    ‘구분자’는 처음에 ‘자동 감지’로, 앞쪽 레코드들에서 쉼표, 세미콜론, 탭, 파이프를 비교해 고릅니다. ‘첫 행은 헤더’가 요소 이름을 정하며, 끄면 열 이름이 column_1, column_2 식으로 붙습니다. ‘빈 줄 건너뛰기’는 빈 줄을 버려 뒤 레코드가 밀리지 않게 합니다.

  3. 루트·행 요소 이름 정하기

    ‘루트 요소’ 기본값은 rows, ‘행 요소’ 기본값은 row입니다. people과 person처럼 가져올 시스템이 기대하는 이름을 입력하세요. 둘 다 문자나 밑줄로 시작하고 공백이 없어야 하며 대소문자와 관계없이 xml로 시작하면 안 됩니다. 어기면 오류 메시지가 규칙을 알려 줍니다.

  4. 값 처리와 형식 고르기

    ‘숫자·불리언·null 감지’에 따라 4.50이 그대로 남을지 4.5가 될지, NA가 빈 요소가 될지가 정해집니다. ‘들여쓰기’는 공백 2칸, 공백 4칸, 탭 중에서 고르고, 결과를 다른 문서 안에 붙여 넣을 때는 ‘XML 선언’을 끄세요.

  5. 복사 또는 다운로드

    이름이 바뀌었거나 셀 수가 다른 열에 대한 안내를 확인한 뒤 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 PriceUnit_x20_Price
1st place_1st_x20_place
xmlid_xmlid
a&ba_x26_b
id2id2
unit-priceunit-price
größegröße

이스케이프와 금지 문자

요소 텍스트 안의 &, <, >는 &amp;, &lt;, &gt;로 바뀝니다. 요소 내용에 필요한 이스케이프는 이것이 전부입니다. 속성을 쓰지 않으므로 큰따옴표와 아포스트로피는 그대로 둡니다. 그래서 <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>&lt;b&gt;</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이 됐습니다. 짧은 두 번째 레코드에는 빠진 셀만큼 스스로 닫는 요소가 들어가고, 셀 수가 다른 레코드와 이름이 바뀐 열이 안내에 표시됩니다.

감지를 끄고 4칸 들여쓰기
입력
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 이름이어야 하며, 그렇지 않으면 결과 대신 오류가 표시됩니다.

&나 < 같은 특수문자는 어떻게 처리되나요?

요소 텍스트 안의 &, <, >는 &amp;, &lt;, &gt;로 이스케이프됩니다. 큰따옴표와 아포스트로피는 요소 내용에서 유효하므로 그대로 둡니다. 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은 페이지에 표시되고 거기서 복사하거나 내려받습니다.

마지막 업데이트: