Apa itu Konversi CSV ke XML?
Konversi CSV ke XML mengubah nilai yang dipisahkan koma menjadi dokumen Extensible Markup Language (XML). Setiap baris CSV menjadi satu elemen XML, dan setiap header kolom dipetakan sebagai nama tag elemen anak. Hasilnya adalah dokumen hierarkis yang mendeskripsikan dirinya sendiri, yang dapat divalidasi terhadap skema (XSD atau DTD) dan diproses dengan perkakas XML standar seperti XSLT, XPath, serta parser SAX/DOM.
XML telah menjadi standar pertukaran data sejak W3C menerbitkan spesifikasi XML 1.0 pada tahun 1998. Meskipun JSON telah menggantikan XML di banyak web API, XML tetap menjadi format yang diperlukan untuk layanan web SOAP, umpan RSS/Atom, grafis SVG, dokumen Office Open XML (.docx, .xlsx), file resource Android, konfigurasi build Maven/Gradle, serta industri yang diatur seperti layanan kesehatan (HL7 CDA), keuangan (FpML, XBRL), dan pemerintahan (NIEM). Ketika data sumber Anda berupa spreadsheet atau ekspor basis data, konversi CSV ke XML adalah cara untuk memasukkan data tersebut ke dalam sistem-sistem ini.
Konverter CSV ke XML yang benar harus menangani kasus tepi RFC 4180: kolom yang dikutip berisi koma atau baris baru, tanda kutip ganda yang di-escape, dan pembatas yang bervariasi. Dari sisi XML, konverter harus meng-escape lima entitas XML yang telah ditentukan (& < > " '), menghasilkan nama elemen yang valid dari header (mengganti spasi dan karakter khusus), serta menghasilkan output yang well-formed dengan deklarasi XML yang tepat dan pengkodean yang konsisten.
Mengapa Menggunakan Konverter CSV ke XML?
Menulis XML secara manual dari data spreadsheet lambat dan rawan kesalahan. Melewatkan satu tag penutup atau lupa meng-escape tanda ampersand menghasilkan XML yang tidak valid dan merusak parser hilir. Konverter ini menangani penguraian, escaping, dan pembuatan elemen dalam satu langkah.
Kasus Penggunaan CSV ke XML
Referensi Pemetaan CSV ke XML
Memahami cara setiap bagian file CSV dipetakan ke struktur XML membantu Anda memprediksi format output dan menyesuaikan data sebelum konversi.
| Konsep CSV | Padanan XML | Detail |
|---|---|---|
| CSV file | XML document | The entire file maps to a root element containing all records |
| Header row | Element tag names | Each column header becomes the tag name for child elements |
| Data row | <row> element | Each row becomes a repeating child element of the root |
| Cell value | Text node | Cell content becomes the text inside the corresponding tag |
| Empty cell | Empty element or omitted | Can be rendered as <field/> or excluded from output |
| Comma delimiter | XML structure | Delimiters are replaced by element nesting and closing tags |
CSV vs XML
CSV adalah format berbasis pembatas yang datar tanpa skema atau tipe data bawaan. XML adalah bahasa markup hierarkis yang mendeskripsikan dirinya sendiri dan mendukung skema, namespace, serta penumpukan yang kompleks. Pilihan di antara keduanya bergantung pada kebutuhan sistem hilir Anda.
Contoh Kode
Berikut adalah contoh konversi CSV ke XML yang dapat dijalankan dalam berbagai bahasa. Setiap contoh mengurai baris header CSV sebagai nama tag elemen, membungkus setiap baris data dalam elemen kontainer, dan meng-escape entitas XML pada konten sel.
// 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, '&')
.replace(/</g, '<').replace(/>/g, '>')
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>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>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>
}# 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