Cos'è la conversione da CSV a XML?
La conversione da CSV a XML trasforma valori separati da virgola in documenti XML (Extensible Markup Language). Ogni riga del CSV diventa un elemento XML, e ogni intestazione di colonna viene mappata come nome di tag figlio. Il risultato è un documento gerarchico e autodescrittivo che i sistemi possono validare rispetto a uno schema (XSD o DTD) ed elaborare con gli strumenti XML standard come XSLT, XPath e i parser SAX/DOM.
XML è uno standard di interscambio dati dal 1998, quando il W3C pubblicò la specifica XML 1.0. Sebbene JSON abbia sostituito XML in molte API web, XML rimane il formato richiesto per i web service SOAP, i feed RSS/Atom, la grafica SVG, i documenti Office Open XML (.docx, .xlsx), i file di risorse Android, le configurazioni di build Maven/Gradle, e settori regolamentati come sanità (HL7 CDA), finanza (FpML, XBRL) e pubblica amministrazione (NIEM). Quando i dati sorgente sono un foglio di calcolo o un export da database, la conversione da CSV a XML è il modo per portarli in questi sistemi.
Un corretto convertitore da CSV a XML deve gestire i casi limite dell'RFC 4180: campi tra virgolette che contengono virgole o interruzioni di riga, virgolette doppie precedute da escape, e delimitatori variabili. Sul lato XML, deve fare l'escape delle cinque entità XML predefinite (& < > " '), generare nomi di elemento validi dalle intestazioni (sostituendo spazi e caratteri speciali), e produrre output ben formato con una corretta dichiarazione XML e codifica coerente.
Perché usare un convertitore da CSV a XML?
Scrivere XML a mano a partire da dati di un foglio di calcolo è lento e soggetto a errori. Un tag di chiusura mancante o un ampersand non preceduto da escape produce XML non valido che blocca i parser a valle. Questo convertitore gestisce parsing, escape e generazione degli elementi in un unico passaggio.
Casi d'uso della conversione da CSV a XML
Riferimento alla mappatura da CSV a XML
Capire come ogni parte di un file CSV si mappa sulla struttura XML aiuta a prevedere il formato dell'output e a preparare i dati prima della conversione.
| Concetto CSV | Equivalente XML | Dettagli |
|---|---|---|
| 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 è un formato piatto basato su delimitatori, senza schema né tipi di dato incorporati. XML è un linguaggio di markup gerarchico e autodescrittivo che supporta schemi, namespace e annidamento complesso. La scelta tra i due dipende dai requisiti del sistema a valle.
Esempi di codice
Di seguito sono riportati esempi funzionanti di conversione da CSV a XML in diversi linguaggi. Ogni esempio analizza la riga di intestazione del CSV come nomi di tag elemento, racchiude ogni riga di dati in un elemento contenitore ed esegue l'escape delle entità XML nel contenuto delle celle.
// 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