Vad är CSV till XML-konvertering?
CSV till XML-konvertering omvandlar kommaseparerade värden till XML-dokument (Extensible Markup Language). Varje rad i CSV-filen blir ett XML-element, och varje kolumnrubrik mappas till ett underordnat elementtaggnamn. Resultatet är ett hierarkiskt, självbeskrivande dokument som system kan validera mot ett schema (XSD eller DTD) och bearbeta med standardverktyg för XML, till exempel XSLT, XPath och SAX/DOM-tolkare.
XML har varit en standard för datautbyte sedan W3C publicerade XML 1.0-specifikationen 1998. Även om JSON har ersatt XML i många webb-API:er är XML fortfarande det obligatoriska formatet för SOAP-webbtjänster, RSS/Atom-flöden, SVG-grafik, Office Open XML-dokument (.docx, .xlsx), Android-resursfiler, Maven/Gradle-byggkonfigurationer samt reglerade branscher som vård (HL7 CDA), finans (FpML, XBRL) och offentlig sektor (NIEM). När källdata är ett kalkylblad eller databasexport är CSV till XML-konvertering sättet att föra in den i dessa system.
En korrekt CSV till XML-konverterare måste hantera RFC 4180-kantfall: citerade fält som innehåller kommatecken eller radbrytningar, undkomna dubbla citattecken och varierande avgränsare. På XML-sidan måste den undkomma de fem fördefinierade XML-entiteterna (& < > " '), generera giltiga elementnamn från rubriker (ersätta mellanslag och ogiltiga tecken) och producera välformaterad utmatning med en korrekt XML-deklaration och konsekvent kodning.
Varför använda en CSV till XML-konverterare?
Att skriva XML för hand från kalkylbladsdata är långsamt och felbenäget. En saknad sluttagg eller ett bortglömt ampersand-escape producerar ogiltig XML som bryter efterföljande tolkare. Den här konverteraren hanterar tolkning, escaping och elementgenerering i ett enda steg.
Användningsfall för CSV till XML
Referens för CSV till XML-mappning
Att förstå hur varje del av en CSV-fil mappas till XML-struktur hjälper dig att förutsäga utmatningsformatet och justera dina data innan konvertering.
| CSV-begrepp | XML-motsvarighet | Detaljer |
|---|---|---|
| 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 är ett platt, avgränsarbaserat format utan inbyggt schema eller datatyper. XML är ett hierarkiskt, självbeskrivande märkspråk som stöder scheman, namnrymder och komplex nästling. Valet mellan dem beror på vilka krav ditt målsystem ställer.
Kodexempel
Nedan finns fungerande exempel på CSV till XML-konvertering i olika programmeringsspråk. Varje exempel tolkar CSV-rubrikraden som elementtaggnamn, omsluter varje datarad i ett behållarelement och escaper XML-entiteter i cellinnehåll.
// 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