YAML a XML
Converte YAML in formato XML
Input YAML
Output XML
Cos'è la conversione da YAML a XML?
La conversione da YAML a XML trasforma dati scritti in YAML (YAML Ain't Markup Language) in XML (Extensible Markup Language). YAML usa l'indentazione e una punteggiatura minima per rappresentare dati strutturati, mentre XML usa tag di apertura e chiusura con una gerarchia esplicita. Convertire tra i due formati è un'operazione routinaria quando i sistemi che consumano XML devono ricevere dati originariamente scritti in YAML.
YAML è stato progettato per la leggibilità umana. I file di configurazione di strumenti come Kubernetes, Ansible, Docker Compose e GitHub Actions sono scritti in YAML perché è compatto e facile da modificare a mano. XML, definito dalla specifica W3C XML 1.0, è stato il formato di scambio dati predefinito in sistemi enterprise, servizi web SOAP e flussi di lavoro incentrati sui documenti per decenni. Quando una configurazione scritta in YAML deve alimentare una pipeline basata su XML, la conversione è necessaria.
La mappatura tra YAML e XML non è uno a uno. YAML supporta tipi di dati come booleani, interi, float e null in modo nativo, mentre XML tratta tutto il contenuto come testo a meno che uno schema (XSD o DTD) non definisca i tipi esternamente. Le sequenze YAML (liste) non hanno un equivalente XML diretto e devono essere rappresentate come elementi ripetuti. Conoscere queste differenze aiuta a prevedere l'output ed evitare sorprese.
Perché usare questo convertitore YAML a XML?
Riscrivere manualmente YAML in XML è tedioso e soggetto a errori, specialmente per strutture profondamente annidate. Questo convertitore gestisce la traduzione strutturale all'istante.
Casi d'uso della conversione YAML a XML
Riferimento alla mappatura dei tipi YAML in XML
I tipi di dati YAML non si mappano direttamente in XML. Questa tabella mostra come ogni costrutto YAML si traduce nel proprio equivalente XML. Comprendere queste regole aiuta a prevedere l'output e risolvere risultati inattesi.
| Tipo YAML | Esempio YAML | Output XML |
|---|---|---|
| Mapping (key: value) | { name: Alice } | <name>Alice</name> |
| Sequence (- item) | - apple\n- banana | <item>apple</item><item>banana</item> |
| Nested mapping | user:\n name: Alice | <user><name>Alice</name></user> |
| Scalar (string) | greeting: hello world | <greeting>hello world</greeting> |
| Scalar (number) | count: 42 | <count>42</count> |
| Scalar (boolean) | active: true | <active>true</active> |
| Null | value: null | <value/> |
| Multiline string | bio: |\n Line one\n Line two | <bio>Line one\nLine two</bio> |
YAML vs XML: differenze tra formati
YAML e XML risolvono lo stesso problema — la rappresentazione di dati strutturati — con compromessi diversi. Nessuno dei due è universalmente migliore; la scelta giusta dipende da chi o cosa consuma i dati.
| Caratteristica | YAML | XML |
|---|---|---|
| Sintassi | Basata sull'indentazione | Basata su tag (<tag>...</tag>) |
| Tipi di dati | Nativi (string, int, bool, null, float) | Solo testo (lo schema aggiunge i tipi) |
| Commenti | # commenti inline | <!-- commenti a blocco --> |
| Attributi | Nessun supporto nativo | Sì (<tag attr="val">) |
| Namespace | Non supportati | Sì (xmlns:prefix) |
| Dimensione file | Più piccola (nessun tag di chiusura) | Più grande (tag verbosi) |
Esempi di codice
Come convertire YAML in XML a livello programmatico in diversi linguaggi e ambienti:
import { parseDocument } from 'yaml'
import { js2xml } from 'xml-js'
const yamlStr = `
server:
host: localhost
port: 8080
ssl: true
`
const data = parseDocument(yamlStr).toJSON()
const xml = js2xml({ root: data }, { compact: true, spaces: 2 })
console.log(xml)
// → <root>
// → <server>
// → <host>localhost</host>
// → <port>8080</port>
// → <ssl>true</ssl>
// → </server>
// → </root>import yaml
import xml.etree.ElementTree as ET
yaml_str = """
database:
host: db.example.com
port: 5432
credentials:
user: admin
password: secret
"""
data = yaml.safe_load(yaml_str)
def dict_to_xml(tag, d):
elem = ET.Element(tag)
for key, val in d.items():
child = ET.SubElement(elem, key)
if isinstance(val, dict):
child.extend(dict_to_xml(key, val))
elem.remove(child)
elem.append(dict_to_xml(key, val))
else:
child.text = str(val)
return elem
root = dict_to_xml('root', data)
ET.indent(root, space=' ')
print(ET.tostring(root, encoding='unicode'))
# → <root>
# → <database>
# → <host>db.example.com</host>
# → <port>5432</port>
# → ...
# → </database>
# → </root>package main
import (
"encoding/xml"
"fmt"
"gopkg.in/yaml.v3"
)
type Server struct {
XMLName xml.Name `xml:"server"`
Host string `yaml:"host" xml:"host"`
Port int `yaml:"port" xml:"port"`
SSL bool `yaml:"ssl" xml:"ssl"`
}
func main() {
yamlData := []byte("host: localhost\nport: 8080\nssl: true")
var s Server
yaml.Unmarshal(yamlData, &s)
xmlBytes, _ := xml.MarshalIndent(s, "", " ")
fmt.Println(xml.Header + string(xmlBytes))
// → <?xml version="1.0" encoding="UTF-8"?>
// → <server>
// → <host>localhost</host>
// → <port>8080</port>
// → <ssl>true</ssl>
// → </server>
}# Using yq (YAML processor) with xq (XML wrapper around jq) # Install: pip install yq # Convert YAML file to XML yq -x . config.yaml # → <host>localhost</host><port>8080</port> # Pipe inline YAML through conversion echo "name: Alice" | yq -x . # → <name>Alice</name>