---
seo_title: API CSV in XML | Converti file CSV in XML | EnConvert
meta_desc: Converti CSV in XML con POST /v1/convert/csv-to-xml. Le intestazioni diventano tag degli elementi, ogni riga un elemento item. Download diretto o URL prefirmato.
keywords: csv in xml api, convertire csv in xml, api conversione csv xml, csv to xml rest api, convertire file csv in xml online, csv in xml python, csv in xml curl, trasformare righe csv in xml api
---

# API CSV in XML

L'API CSV in XML converte un file CSV in formato XML con una singola richiesta a `POST /v1/convert/csv-to-xml`. Carica un file `.csv` UTF-8 tramite multipart form data. Le intestazioni di colonna della prima riga diventano i nomi dei tag XML e ogni riga successiva diventa un elemento `<item>` dentro un wrapper `<root>`. La risposta è XML grezzo per impostazione predefinita, oppure imposta `direct_download=false` per i metadati con un URL di download prefirmato.

---

## Endpoint

```
POST /v1/convert/csv-to-xml
```

**Content-Type:** `multipart/form-data`

**Input accettato:** file `.csv` (codificati in UTF-8)

**Formato di output:** `.xml` (`application/xml`)

---

## Autenticazione

Richiede una chiave API privata oppure un token JWT ottenuto da una chiave pubblica.

```
X-API-Key: sk_your_private_key
```

Oppure:

```
Authorization: Bearer <jwt_token>
```

---

## Parametri della richiesta

| Parametro | Tipo | Obbligatorio | Predefinito | Descrizione |
|-----------|------|----------|---------|-------------|
| `file` | file | Sì | -- | Il file `.csv` da convertire. La prima riga deve contenere le intestazioni di colonna. Codificato in UTF-8. |
| `output_filename` | `string` | No | Nome file di input | Nome file di output personalizzato. L'estensione `.xml` viene aggiunta automaticamente. |
| `direct_download` | `boolean` | No | `true` | Con `true`, restituisce i byte XML grezzi. Con `false`, restituisce i metadati con un URL di download prefirmato. |

---

## Regole di conversione

```csv
name,age,city
Alice,30,London
Bob,25,Paris
```

Diventa:

```xml
<?xml version="1.0" encoding="utf-8"?>
<root>
  <item>
    <name>Alice</name>
    <age>30</age>
    <city>London</city>
  </item>
  <item>
    <name>Bob</name>
    <age>25</age>
    <city>Paris</city>
  </item>
</root>
```

- La prima riga è trattata come intestazioni di colonna (usate come nomi dei tag XML)
- Ogni riga successiva diventa un elemento `<item>`
- L'elemento radice è sempre `<root>` (non configurabile)
- L'output è formattato con indentazione a 2 spazi
- Il delimitatore è la virgola (non configurabile)

---

## Risposta

### Download diretto (`direct_download=true`, predefinito)

```
HTTP 200 OK
Content-Type: application/xml
Content-Disposition: inline; filename="data_20260405_123456789.xml"
```

### Risposta con metadati (`direct_download=false`)

```json
{
    "presigned_url": "https://spaces.example.com/...",
    "object_key": "env/files/{project_id}/csv-to-xml/data_20260405_123456789.xml",
    "filename": "data_20260405_123456789.xml",
    "file_size": 1234,
    "conversion_time_seconds": 0.03
}
```

---

## Esempi di codice

### Python

```python
import requests

with open("data.csv", "rb") as f:
    response = requests.post(
        "https://api.enconvert.com/v1/convert/csv-to-xml",
        headers={"X-API-Key": "sk_your_private_key"},
        files={"file": ("data.csv", f, "text/csv")}
    )

with open("data.xml", "wb") as out:
    out.write(response.content)
```

### Node.js

```javascript
const form = new FormData();
form.append("file", fs.createReadStream("data.csv"));

const response = await fetch("https://api.enconvert.com/v1/convert/csv-to-xml", {
    method: "POST",
    headers: { "X-API-Key": "sk_your_private_key" },
    body: form
});

const xml = await response.text();
```

### PHP

```php
$ch = curl_init("https://api.enconvert.com/v1/convert/csv-to-xml");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ["X-API-Key: sk_your_private_key"],
    CURLOPT_POSTFIELDS => ["file" => new CURLFile("data.csv", "text/csv")]
]);
$xml = curl_exec($ch);
curl_close($ch);
```

### Go

```go
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, _ := writer.CreateFormFile("file", "data.csv")
file, _ := os.Open("data.csv")
io.Copy(part, file)
writer.Close()

req, _ := http.NewRequest("POST", "https://api.enconvert.com/v1/convert/csv-to-xml", body)
req.Header.Set("Content-Type", writer.FormDataContentType())
req.Header.Set("X-API-Key", "sk_your_private_key")
resp, _ := http.DefaultClient.Do(req)
```

---

## Risposte di errore

| Stato | Condizione |
|--------|-----------|
| `400 Bad Request` | Il file non è un file `.csv` |
| `400 Bad Request` | Il file CSV è vuoto o non contiene righe valide |
| `400 Bad Request` | Codifica CSV non valida (attesa UTF-8) |
| `401 Unauthorized` | Chiave API / token JWT mancante o non valido |
| `402 Payment Required` | Quota mensile di ops esaurita |
| `413 Payload Too Large` | Il file supera la dimensione massima prevista dal piano |

---

## Limiti

| Limite | Valore |
|-------|-------|
| Dimensione massima del file | Dipende dal piano (Founding: 5 MB) |
| Codifica di input | Solo UTF-8 |
| Conversioni mensili | Dipende dal piano |

---

## Domande frequenti

### Come convertire CSV in XML con un'API REST?

Invia una richiesta POST `multipart/form-data` a `POST /v1/convert/csv-to-xml` con il file `.csv` nel campo `file`, autenticandoti con un header `X-API-Key` o un token JWT `Authorization: Bearer`. Per impostazione predefinita il corpo della risposta contiene i byte XML grezzi.

### Come mappa l'API le colonne e le righe CSV sugli elementi XML?

La prima riga del CSV è trattata come intestazioni di colonna e usata come nomi dei tag XML. Ogni riga successiva diventa un elemento `<item>` dentro un wrapper `<root>`, formattato con indentazione a 2 spazi.

### Posso cambiare il nome dell'elemento radice XML o il delimitatore CSV?

No. L'elemento radice è sempre `<root>` e il delimitatore è la virgola. Nessuno dei due è configurabile.

### Perché la conversione da CSV a XML restituisce un errore 400?

Un `400 Bad Request` viene restituito quando il file caricato non è un `.csv`, il CSV è vuoto o non contiene righe valide, oppure la codifica non è UTF-8.

### Posso ottenere un URL di download prefirmato invece dell'XML grezzo?

Sì. Imposta `direct_download=false` e l'API restituisce metadati JSON che includono `presigned_url`, `object_key`, `filename`, `file_size` e `conversion_time_seconds`.
