XML para YAML
Converte XML para formato YAML
Entrada XML
Saída YAML
O que é Conversão de XML para YAML?
A conversão de XML para YAML transforma dados de Extensible Markup Language (XML) para YAML Ain't Markup Language (YAML). O XML usa tags com atributos para descrever dados hierárquicos, enquanto o YAML representa as mesmas estruturas por meio de indentação e pares chave-valor em texto puro. Converter XML para YAML online é uma tarefa comum ao migrar configurações de sistemas baseados em XML — como Java Spring, Maven ou .NET — para plataformas que preferem YAML, como Kubernetes, Ansible, GitHub Actions e Docker Compose.
Os dois formatos diferem em seus modelos de dados. O XML trata tudo como texto por padrão e depende de definições de schema (XSD, DTD) para impor tipos. O YAML tem tipos nativos: strings, inteiros, floats, booleanos, nulos, sequências (arrays) e mapeamentos (objetos). Durante a conversão, valores como "true", "5432" e "3.14" podem ser interpretados como tipos nativos YAML em vez de permanecerem strings. Um conversor cuidadoso coloca esses valores entre aspas para preservar a representação textual original da fonte XML.
O XML também suporta construções sem equivalente em YAML: atributos, namespaces, instruções de processamento, seções CDATA e comentários. A conversão precisa escolher uma convenção para representar atributos (comumente chaves com prefixo de underscore, como _attr) e decidir se descarta ou achata o restante. Entender esses trade-offs antes de converter ajuda a escolher a ferramenta certa, configurá-la corretamente e verificar que a saída YAML corresponde à intenção original do XML.
<server>
<host>db.example.com</host>
<port>5432</port>
<credentials admin="true">
<username>deploy</username>
<password>s3cret</password>
</credentials>
<options>
<option>ssl=true</option>
<option>timeout=30</option>
</options>
</server>server:
host: db.example.com
port: "5432"
credentials:
_admin: "true"
username: deploy
password: s3cret
options:
option:
- ssl=true
- timeout=30Por que Usar um Conversor de XML para YAML Online?
Escrever um script de conversão manualmente significa lidar com mapeamento de atributos, detecção de arrays em elementos repetidos e casos extremos de coerção de tipos do YAML. Um conversor no navegador resolve tudo isso em uma única etapa, permitindo inspecionar a saída YAML e copiá-la diretamente para seus arquivos de configuração.
Casos de Uso da Conversão XML para YAML
Referência de Mapeamento XML para YAML
XML e YAML têm modelos de dados diferentes. A tabela abaixo mostra como cada construção XML mapeia para um equivalente YAML. Atributos são tipicamente convertidos para chaves com prefixo de underscore, e elementos repetidos tornam-se sequências YAML. Algumas construções, como comentários e instruções de processamento, não possuem representação em YAML e são descartadas durante a conversão.
| Construção XML | Exemplo XML | Equivalente YAML |
|---|---|---|
| Element | <name>text</name> | name: text |
| Nested elements | <a><b>1</b></a> | a:\n b: "1" |
| Attributes | <el attr="v"/> | el:\n _attr: v |
| Text + attributes | <el a="1">text</el> | el:\n _a: "1"\n _text: text |
| Repeated elements | <r><i>1</i><i>2</i></r> | r:\n i:\n - "1"\n - "2" |
| Empty element | <el/> | el: "" |
| CDATA | <![CDATA[raw]]> | Treated as plain text |
| Comments | <!-- note --> | Discarded (no YAML equivalent) |
| Namespaces | xmlns:ns="uri" | Prefix preserved or stripped |
| Boolean-like text | <flag>true</flag> | flag: "true" (quoted to stay string) |
XML vs YAML: Diferenças no Modelo de Dados
Converter entre XML e YAML não é uma simples troca de sintaxe. Os formatos têm diferenças estruturais fundamentais que afetam como os dados são representados após a conversão.
Exemplos de Código
Abaixo estão exemplos funcionais para converter XML para YAML em JavaScript, Python, Go e na linha de comando. Cada exemplo lida com elementos aninhados, atributos e tags irmãs repetidas.
import { parseStringPromise } from 'xml2js'
import YAML from 'yaml'
const xml = `
<config>
<database host="localhost" port="5432">
<name>mydb</name>
</database>
<features>
<feature>auth</feature>
<feature>logging</feature>
</features>
</config>`
const obj = await parseStringPromise(xml, { explicitArray: false })
console.log(YAML.stringify(obj))
// → config:
// → database:
// → $:
// → host: localhost
// → port: "5432"
// → name: mydb
// → features:
// → feature:
// → - auth
// → - loggingimport xmltodict
import yaml
xml = """
<server>
<host>db.example.com</host>
<port>5432</port>
<replicas>
<replica>node-1</replica>
<replica>node-2</replica>
</replicas>
</server>
"""
# Step 1: XML → Python dict
data = xmltodict.parse(xml)
# Step 2: Python dict → YAML
print(yaml.dump(data, default_flow_style=False))
# → server:
# → host: db.example.com
# → port: '5432'
# → replicas:
# → replica:
# → - node-1
# → - node-2
# With the standard library only (no xmltodict)
import xml.etree.ElementTree as ET
def elem_to_dict(elem):
d = {}
if elem.attrib:
d.update({f"_{k}": v for k, v in elem.attrib.items()})
for child in elem:
val = elem_to_dict(child)
if child.tag in d:
if not isinstance(d[child.tag], list):
d[child.tag] = [d[child.tag]]
d[child.tag].append(val)
else:
d[child.tag] = val
if elem.text and elem.text.strip():
text = elem.text.strip()
return text if not d else {**d, "_text": text}
return d
root = ET.fromstring(xml)
print(yaml.dump({root.tag: elem_to_dict(root)}, default_flow_style=False))# xq is part of the yq package (pip install yq) # It parses XML via xq and outputs JSON, then pipe to yq for YAML echo '<config><host>localhost</host><port>8080</port></config>' | xq . | yq -y . # → config: # → host: localhost # → port: "8080" # Using xmlstarlet + yq (Go version: https://github.com/mikefarah/yq) xmlstarlet sel -t -c '/' input.xml | yq -p=xml -o=yaml # Reads XML from file and outputs YAML directly
package main
import (
"encoding/xml"
"fmt"
"strings"
"gopkg.in/yaml.v3"
)
type Server struct {
XMLName xml.Name `xml:"server"`
Host string `xml:"host" yaml:"host"`
Port int `xml:"port" yaml:"port"`
Options []string `xml:"options>option" yaml:"options"`
}
func main() {
data := `<server>
<host>db.example.com</host>
<port>5432</port>
<options><option>ssl=true</option><option>timeout=30</option></options>
</server>`
var srv Server
xml.NewDecoder(strings.NewReader(data)).Decode(&srv)
out, _ := yaml.Marshal(srv)
fmt.Println(string(out))
// → host: db.example.com
// → port: 5432
// → options:
// → - ssl=true
// → - timeout=30
}