Wat is CSV naar XML-conversie?
CSV naar XML-conversie zet kommagescheiden waarden om naar Extensible Markup Language (XML)-documenten. Elke rij van de CSV wordt een XML-element, en elke kolomkop wordt de naam van een child-elementtag. Het resultaat is een hiërarchisch, zelfbeschrijvend document dat systemen kunnen valideren tegen een schema (XSD of DTD) en verwerken met standaard XML-tooling zoals XSLT, XPath en SAX/DOM-parsers.
XML is al sinds 1998 een standaard voor gegevensuitwisseling, toen het W3C de XML 1.0-specificatie publiceerde. Hoewel JSON XML in veel web-API's heeft vervangen, is XML nog steeds het vereiste formaat voor SOAP-webservices, RSS/Atom-feeds, SVG-graphics, Office Open XML-documenten (.docx, .xlsx), Android-resourcebestanden, Maven/Gradle-buildconfiguraties en gereguleerde sectoren zoals gezondheidszorg (HL7 CDA), financiën (FpML, XBRL) en overheid (NIEM). Als je brongegevens een spreadsheet of database-export zijn, is CSV-naar-XML-conversie de manier om ze in deze systemen te krijgen.
Een correcte CSV naar XML-converter moet RFC 4180-randgevallen verwerken: geciteerde velden met komma's of regeleinden, geëscapete dubbele aanhalingstekens en wisselende scheidingstekens. Aan de XML-kant moet de converter de vijf voorgedefinieerde XML-entiteiten escapen (& < > " '), geldige elementnamen genereren op basis van kolomkoppen (door spaties en speciale tekens te vervangen) en goed gevormd uitvoer produceren met een correcte XML-declaratie en consistente codering.
Waarom een CSV naar XML-converter gebruiken?
XML handmatig schrijven vanuit spreadsheetgegevens is traag en foutgevoelig. Een ontbrekende sluitende tag of een vergeten escaped ampersand levert ongeldige XML op die downstream parsers breekt. Deze converter verwerkt het parsen, escapen en genereren van elementen in één stap.
CSV naar XML-toepassingen
Referentie: CSV naar XML-mapping
Inzicht in hoe elk onderdeel van een CSV-bestand naar XML-structuur wordt omgezet, helpt je de uitvoerindeling te voorspellen en je gegevens vóór conversie aan te passen.
| CSV-concept | XML-equivalent | Details |
|---|---|---|
| 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 versus XML
CSV is een plat, scheidingsteken-gebaseerd formaat zonder ingebouwd schema of gegevenstypen. XML is een hiërarchische, zelfbeschrijvende opmaaktaal die schema's, namespaces en complexe nesting ondersteunt. De keuze tussen beide hangt af van de vereisten van je downstream systeem.
Codevoorbeelden
Hieronder staan werkende voorbeelden van CSV naar XML-conversie in verschillende talen. Elk voorbeeld parseert de CSV-headerrij als elementtagnamen, wikkelt elke gegevensrij in een containerelement en escapet XML-entiteiten in celinhoud.
// 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