Was ist CSV-zu-XML-Konvertierung?
Die CSV-zu-XML-Konvertierung wandelt kommagetrennte Werte in XML-Dokumente (Extensible Markup Language) um. Jede Zeile der CSV-Datei wird zu einem XML-Element, und jeder Spaltenname wird zum Tag-Namen eines untergeordneten Elements. Das Ergebnis ist ein hierarchisches, selbstbeschreibendes Dokument, das Systeme gegen ein Schema (XSD oder DTD) validieren und mit Standard-XML-Werkzeugen wie XSLT, XPath sowie SAX/DOM-Parsern verarbeiten können.
XML ist seit der Veröffentlichung der XML 1.0-Spezifikation durch das W3C im Jahr 1998 ein Standard für den Datenaustausch. Obwohl JSON XML in vielen Web-APIs abgelöst hat, bleibt XML das erforderliche Format für SOAP-Webdienste, RSS/Atom-Feeds, SVG-Grafiken, Office Open XML-Dokumente (.docx, .xlsx), Android-Ressourcendateien, Maven/Gradle-Build-Konfigurationen sowie regulierte Branchen wie das Gesundheitswesen (HL7 CDA), Finanzen (FpML, XBRL) und öffentliche Verwaltung (NIEM). Wenn die Quelldaten aus einer Tabellenkalkulation oder einem Datenbankexport stammen, ist die CSV-zu-XML-Konvertierung der Weg, sie in diese Systeme zu überführen.
Ein korrekter CSV-zu-XML-Konverter muss RFC 4180-Sonderfälle behandeln: Felder in Anführungszeichen mit Kommas oder Zeilenumbrüchen, maskierte doppelte Anführungszeichen und unterschiedliche Trennzeichen. Auf der XML-Seite muss er die fünf vordefinierten XML-Entities maskieren (& < > " '), aus Spaltenköpfen gültige Elementnamen erzeugen (Leerzeichen und Sonderzeichen ersetzen) und eine wohlgeformte Ausgabe mit einer korrekten XML-Deklaration und konsistenter Kodierung liefern.
Warum einen CSV-zu-XML-Konverter verwenden?
XML manuell aus Tabellendaten zu schreiben ist langsam und fehleranfällig. Ein fehlendes schließendes Tag oder ein nicht maskiertes &-Zeichen erzeugt ungültiges XML, das nachgelagerte Parser zum Absturz bringt. Dieser Konverter übernimmt Parsing, Maskierung und Elementerzeugung in einem einzigen Schritt.
Anwendungsfälle für CSV zu XML
Referenz: CSV-zu-XML-Zuordnung
Das Verständnis, wie jeder Teil einer CSV-Datei auf die XML-Struktur abgebildet wird, hilft dabei, das Ausgabeformat vorherzusagen und Daten vor der Konvertierung anzupassen.
| CSV-Konzept | XML-Äquivalent | 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 vs. XML
CSV ist ein flaches, trennzeichenbasiertes Format ohne eingebautes Schema oder Datentypen. XML ist eine hierarchische, selbstbeschreibende Auszeichnungssprache mit Unterstützung für Schemas, Namespaces und komplexe Verschachtelung. Die Wahl hängt von den Anforderungen des nachgelagerten Systems ab.
Code-Beispiele
Nachfolgend funktionierende Beispiele zur CSV-zu-XML-Konvertierung in verschiedenen Sprachen. Jedes Beispiel liest die CSV-Kopfzeile als Elementnamen, umschließt jede Datenzeile mit einem Container-Element und maskiert XML-Entities im Zellinhalt.
// 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