ToolDeck

CSV to XML 변환기

CSV 데이터를 XML 형식으로 변환

예시 시도

CSV 입력

XML 출력

로컬에서 실행 · 시크릿 붙여넣기 안전
XML 출력이 여기에 표시됩니다…

CSV to XML 변환이란?

CSV to XML 변환은 쉼표로 구분된 값을 XML(Extensible Markup Language) 문서로 변환하는 작업입니다. CSV의 각 행은 XML 요소가 되고, 각 열 헤더는 자식 요소 태그 이름으로 매핑됩니다. 결과물은 계층적이고 자기 설명적인 문서로, 시스템이 스키마(XSD 또는 DTD)에 대해 검증하고 XSLT, XPath, SAX/DOM 파서 같은 표준 XML 도구로 처리할 수 있습니다.

XML은 W3C가 1998년 XML 1.0 명세를 발표한 이후 데이터 교환 표준으로 사용되어 왔습니다. 많은 웹 API에서 JSON이 XML을 대체했지만, XML은 SOAP 웹 서비스, RSS/Atom 피드, SVG 그래픽, Office Open XML 문서(.docx, .xlsx), Android 리소스 파일, Maven/Gradle 빌드 설정, 그리고 의료(HL7 CDA), 금융(FpML, XBRL), 정부(NIEM) 같은 규제 산업에서 여전히 필수 형식입니다. 원본 데이터가 스프레드시트나 데이터베이스 내보내기인 경우, CSV to XML 변환을 통해 이러한 시스템에 데이터를 공급할 수 있습니다.

올바른 CSV to XML 변환기는 RFC 4180 엣지 케이스를 처리해야 합니다. 쉼표나 줄바꿈이 포함된 따옴표 필드, 이스케이프된 큰따옴표, 다양한 구분자가 여기에 해당합니다. XML 측면에서는 다섯 가지 미리 정의된 XML 엔티티(& < > " ')를 이스케이프하고, 헤더에서 유효한 요소 이름을 생성하며(공백과 특수 문자 교체), 적절한 XML 선언과 일관된 인코딩으로 올바른 형식의 출력을 생성해야 합니다.

CSV to XML 변환기를 사용하는 이유

스프레드시트 데이터에서 XML을 직접 작성하는 것은 느리고 오류가 발생하기 쉽습니다. 닫는 태그를 빠뜨리거나 앰퍼샌드 이스케이프를 잊으면 유효하지 않은 XML이 생성되어 하위 파서가 중단됩니다. 이 변환기는 파싱, 이스케이프, 요소 생성을 한 번에 처리합니다.

브라우저에서 즉시 변환
CSV를 붙여넣으면 적절한 XML 선언, 루트 요소, 중첩된 자식 요소를 갖춘 올바른 형식의 XML 출력을 즉시 얻을 수 있습니다. 커맨드라인 도구나 라이브러리 설치가 필요 없습니다.
🔒
데이터를 비공개로 유지
모든 변환은 JavaScript를 사용하여 브라우저에서 로컬로 실행됩니다. CSV 데이터는 서버에 업로드되거나 로깅되거나 기기 외부에 저장되지 않습니다.
🎯
유효하고 올바른 형식의 XML 생성
출력은 XML 엔티티를 이스케이프하고, 헤더 이름을 유효한 요소 태그로 정제하며, XML 검사기나 린터를 통과하는 적절히 중첩된 마크업을 생성합니다.
📋
모든 CSV 방언 처리
쉼표, 세미콜론, 탭, 파이프를 구분자로 자동 감지합니다. 이스케이프된 큰따옴표, 여러 줄 필드, BOM이 붙은 UTF-8 파일을 포함한 RFC 4180 인용 규칙을 지원합니다.

CSV to XML 활용 사례

SOAP 및 레거시 API 통합
많은 엔터프라이즈 시스템은 XML 요청 본문이 필요한 SOAP 웹 서비스를 사용합니다. CSV 데이터 내보내기를 서비스의 WSDL 스키마에 맞는 XML 페이로드로 변환한 후 요청을 전송하세요.
빌드 설정 파일 생성
의존성, 문자열, 설정 항목의 스프레드시트에서 Maven pom.xml 의존성 목록, Android 리소스 파일, Spring 빈 정의를 생성합니다. 단일 CSV 소스에서 XML 설정을 일괄 생성하세요.
데이터 파이프라인 ETL
데이터베이스나 분석 도구의 CSV 내보내기를 XML 기반 ETL 파이프라인에 공급합니다. Apache NiFi, Talend, SSIS 같은 도구는 각 단계에서 스키마 검증이 필요한 변환 워크플로의 XML 입력을 수용합니다.
규제 및 컴플라이언스 보고
의료(HL7 CDA), 금융(XBRL, FpML), 정부(NIEM) 같은 산업은 XML 형식의 제출을 요구합니다. 표 형식의 컴플라이언스 데이터를 제출 전에 필요한 XML 구조로 변환하세요.
RSS 및 Atom 피드 생성
기사, 제목, 날짜의 CSV 목록을 RSS 2.0 또는 Atom 피드로 변환합니다. 콘텐츠 관리 워크플로는 종종 신디케이션 피드로 게시해야 하는 게시물의 스프레드시트로 시작합니다.
XML 기초 학습
XML을 배우는 학생들이 익숙한 CSV 데이터를 붙여넣어 결과 요소 계층 구조, 중첩, 엔티티 이스케이프를 확인할 수 있습니다. 입력과 출력을 비교하면 올바른 형식(well-formedness)과 유효성(validity) 같은 추상적인 개념을 구체적으로 이해할 수 있습니다.

CSV to XML 매핑 참조

CSV 파일의 각 부분이 XML 구조에 어떻게 매핑되는지 이해하면 출력 형식을 예측하고 변환 전에 데이터를 조정하는 데 도움이 됩니다.

CSV 개념XML 동등값세부 정보
CSV fileXML documentThe entire file maps to a root element containing all records
Header rowElement tag namesEach column header becomes the tag name for child elements
Data row<row> elementEach row becomes a repeating child element of the root
Cell valueText nodeCell content becomes the text inside the corresponding tag
Empty cellEmpty element or omittedCan be rendered as <field/> or excluded from output
Comma delimiterXML structureDelimiters are replaced by element nesting and closing tags

CSV vs XML

CSV는 기본 스키마나 데이터 타입이 없는 평면적인 구분자 기반 형식입니다. XML은 스키마, 네임스페이스, 복잡한 중첩을 지원하는 계층적이고 자기 설명적인 마크업 언어입니다. 어느 형식을 선택할지는 하위 시스템 요구 사항에 따라 결정됩니다.

CSV
일반 텍스트, 줄당 하나의 레코드. 데이터 타입 없음: 모든 값은 문자열입니다. 계층 구조나 중첩이 없습니다. 파일 크기가 작습니다. 스프레드시트, 데이터베이스, 스크립팅 언어에서 범용으로 지원됩니다. RFC 4180으로 정의됩니다. 열 레이아웃을 모두 이해하는 시스템 간 단순한 표 형식 데이터 전송에 최적입니다.
XML
시작 태그와 닫는 태그가 있는 계층적 마크업입니다. 속성, 네임스페이스, 혼합 콘텐츠, CDATA 섹션을 지원합니다. XSD 또는 DTD 스키마에 대해 검증할 수 있습니다. XSLT, XPath, SAX, DOM 파서로 처리됩니다. 태그 오버헤드로 인해 CSV보다 파일 크기가 큽니다. SOAP API, Office Open XML, RSS/Atom, 많은 규제 산업에서 필수입니다.

코드 예제

다양한 언어에서 CSV to XML 변환을 수행하는 실제 예제입니다. 각 예제는 CSV 헤더 행을 요소 태그 이름으로 파싱하고, 각 데이터 행을 컨테이너 요소로 감싸며, 셀 내용의 XML 엔티티를 이스케이프합니다.

JavaScript (browser / Node.js)
// CSV string → XML with proper escaping
const csv = `name,age,city
Alice,30,Berlin
Bob,25,Tokyo`

function csvToXml(csv, rootTag = 'data', rowTag = 'row') {
  const rows = csv.trim().split('\n').map(r => r.split(','))
  const [headers, ...data] = rows
  const xmlRows = data.map(row => {
    const fields = headers.map((h, i) => {
      const val = (row[i] || '').replace(/&/g, '&amp;')
        .replace(/</g, '&lt;').replace(/>/g, '&gt;')
      return `    <${h}>${val}</${h}>`
    }).join('\n')
    return `  <${rowTag}>\n${fields}\n  </${rowTag}>`
  }).join('\n')
  return `<?xml version="1.0" encoding="UTF-8"?>\n<${rootTag}>\n${xmlRows}\n</${rootTag}>`
}

console.log(csvToXml(csv))
// → <?xml version="1.0" encoding="UTF-8"?>
// → <data><row><name>Alice</name><age>30</age>...</row>...</data>
Python
import csv, io
from xml.etree.ElementTree import Element, SubElement, tostring
from xml.dom.minidom import parseString

csv_string = """name,age,city
Alice,30,Berlin
Bob,25,Tokyo"""

reader = csv.DictReader(io.StringIO(csv_string))
root = Element('data')

for row in reader:
    row_el = SubElement(root, 'row')
    for key, value in row.items():
        child = SubElement(row_el, key)
        child.text = value

# Pretty-print with declaration
raw = tostring(root, encoding='unicode')
pretty = parseString(raw).toprettyxml(indent='  ')
print(pretty)
# → <?xml version="1.0" ?>
# → <data>
# →   <row>
# →     <name>Alice</name>
# →     <age>30</age>
# →     <city>Berlin</city>
# →   </row>
# →   ...
# → </data>
Go
package main

import (
	"encoding/csv"
	"encoding/xml"
	"fmt"
	"os"
	"strings"
)

type Field struct {
	XMLName xml.Name
	Value   string `xml:",chardata"`
}

type Row struct {
	XMLName xml.Name `xml:"row"`
	Fields  []Field
}

type Data struct {
	XMLName xml.Name `xml:"data"`
	Rows    []Row
}

func main() {
	input := "name,age,city\nAlice,30,Berlin\nBob,25,Tokyo"
	r := csv.NewReader(strings.NewReader(input))
	records, _ := r.ReadAll()
	headers := records[0]

	var data Data
	for _, rec := range records[1:] {
		row := Row{}
		for i, h := range headers {
			row.Fields = append(row.Fields, Field{
				XMLName: xml.Name{Local: h},
				Value:   rec[i],
			})
		}
		data.Rows = append(data.Rows, row)
	}

	out, _ := xml.MarshalIndent(data, "", "  ")
	fmt.Println(xml.Header + string(out))
	// → <?xml version="1.0" encoding="UTF-8"?>
	// → <data><row><name>Alice</name>...</row>...</data>
}
CLI (csvkit / xmlstarlet)
# Using Python's csv and xml modules via one-liner
python3 -c "
import csv, sys
from xml.etree.ElementTree import Element, SubElement, tostring
from xml.dom.minidom import parseString

reader = csv.DictReader(sys.stdin)
root = Element('data')
for row in reader:
    r = SubElement(root, 'row')
    for k, v in row.items():
        SubElement(r, k).text = v
print(parseString(tostring(root, encoding='unicode')).toprettyxml(indent='  '))
" < data.csv

# Using Miller (mlr) — a dedicated CSV/JSON/XML tool
mlr --icsv --oxml cat data.csv

자주 묻는 질문

CSV to XML 변환은 어떻게 작동하나요?
변환기는 CSV의 첫 번째 행을 열 헤더로 읽습니다. 이후 각 행은 XML 요소가 되고, 각 셀 값은 열 헤더의 이름을 딴 자식 요소로 감싸집니다. 결과는 데이터 행당 하나의 자식 요소를 포함하는 루트 요소를 가진 올바른 형식의 XML 문서입니다.
CSV 데이터에서 & 나 < 같은 특수 문자는 어떻게 처리되나요?
변환기는 다섯 가지 XML 미리 정의된 엔티티를 모두 이스케이프합니다. &는 &amp;가 되고, <는 &lt;가 되며, >는 &gt;가 되고, "는 &quot;가 되며, '는 &apos;가 됩니다. 이로써 파서를 중단시키거나 올바른 형식 오류를 일으키지 않는 유효한 XML이 생성됩니다.
루트 요소와 행 요소에 사용자 정의 태그 이름을 사용할 수 있나요?
네. 이 도구를 사용하면 루트 요소 이름(기본값: "data")과 행 요소 이름(기본값: "row")을 설정할 수 있습니다. CSV의 열 헤더는 항상 자식 요소 이름이 됩니다. 헤더에 공백이나 XML 요소 이름에 유효하지 않은 문자가 포함된 경우 도구가 자동으로 정제합니다.
CSV to XML과 CSV to JSON의 차이점은 무엇인가요?
CSV to XML은 시작/닫는 태그, XML 선언, 스키마 검증(XSD/DTD) 지원이 있는 계층적 마크업 문서를 생성합니다. CSV to JSON은 더 가벼운 키-값 객체 배열을 생성합니다. 대상 시스템이 XML을 요구하는 경우(SOAP API, 규제 형식, RSS 피드) XML을 사용하세요. REST API, JavaScript 프론트엔드, NoSQL 데이터베이스에는 JSON을 사용하세요.
생성된 XML 출력을 어떻게 검증하나요?
출력을 XML 검사기에 붙여넣어 올바른 형식(올바른 중첩, 적절한 엔티티 이스케이프, 태그 일치)을 확인하세요. 스키마 검증을 위해서는 XSD 파일을 준비하고 xmllint, Xerces, 또는 온라인 XSD 검사기를 사용하세요. 이 도구로 생성된 XML은 항상 올바른 형식이지만, 스키마 유효성은 구조가 대상 스키마와 일치하는지에 따라 달라집니다.
변환기가 대용량 CSV 파일을 처리할 수 있나요?
이 도구는 브라우저에서 실행되므로 성능은 사용 가능한 메모리에 따라 다릅니다. 수 메가바이트(수만 행) 크기의 파일은 최신 하드웨어에서 문제없이 변환됩니다. 매우 큰 파일(100MB 이상)의 경우 Python의 csv 및 xml.etree 모듈이나 Go의 encoding/csv 및 encoding/xml 패키지 같은 커맨드라인 도구를 사용하세요. 이 도구들은 모든 것을 메모리에 로드하지 않고 데이터를 스트림으로 처리합니다.
생성된 XML이 XSLT 변환과 호환되나요?
네. 출력은 XML 선언과 일관된 요소 구조를 갖춘 표준 올바른 형식의 XML입니다. 어떤 XSLT 스타일시트도 적용하여 HTML, 다른 XML 스키마, 또는 일반 텍스트로 변환할 수 있습니다. 예측 가능한 구조(루트 > 행 > 필드 요소) 덕분에 XPath 선택자와 XSLT 템플릿 작성이 간단합니다.