XML parece intimidante em volume, mas todo documento é construído a partir do mesmo pequeno conjunto de peças. Aprenda as peças e qualquer documento se torna legível.

As partes

No topo pode haver uma declaração XML: <?xml version="1.0" encoding="UTF-8"?>. Ela não é um elemento; apenas informa a versão e como os bytes estão codificados. É opcional, mas quando presente precisa ser a primeira coisa no arquivo.

O corpo são elementos. Um elemento é uma tag de abertura, algum conteúdo e uma tag de fechamento correspondente: <title>Guia XML</title>. Elementos podem conter texto, outros elementos, ou nada. Um elemento sem conteúdo pode ser escrito como uma tag de auto-fechamento: <break/> significa o mesmo que <break></break>. Todo documento tem exatamente um elemento mais externo, a raiz, e todo o resto se aninha dentro dele, que é o que torna o XML uma árvore.

Elementos carregam atributos na sua tag de abertura, como pares de nome e valor entre aspas: <book id="bk101" lang="en">. Atributos descrevem o elemento; os valores são sempre entre aspas. Entre as tags fica o conteúdo de texto, o dado de fato: o Guia XML dentro do title.

Lendo de cima a baixo

Para ler um documento, comece na raiz e caminhe para dentro. Cada tag de abertura abre um ramo; sua tag de fechamento correspondente o fecha; a indentação normalmente espelha a profundidade do aninhamento. Faça três perguntas a cada elemento: como ele se chama, quais atributos carrega, e o que contém, seja texto ou mais elementos. Isso basta para reconstruir a forma inteira.

Alguns caracteres são especiais e aparecem como escapes em vez de literalmente: &lt; para um sinal de menor-que, &amp; para um E comercial, &gt;, &quot; e &apos;. Estas são as entidades embutidas, e existem porque um < ou & cru seria de outra forma lido como o início de uma tag ou de uma entidade.

Além de elementos e atributos há três construções especiais, comentários, seções (dados de caractere, do inglês character data) e instruções de processamento, cada uma coberta em seu próprio artigo. E quando os mesmos nomes de elemento poderiam colidir entre vocabulários, namespaces os desambiguam. Mas a espinha dorsal é sempre a mesma: uma única raiz, elementos aninhando dentro de elementos, atributos nas tags, e texto nas folhas.

A ordem importa de um jeito que surpreende quem vem do JSON

XML tem ordem de documento, e ela é significativa: elementos irmãos são uma sequência, não um conjunto. Dois documentos com os mesmos elementos em ordem diferente são documentos diferentes, exatamente o oposto da intuição que as chaves de objeto do JSON constroem.

Isso tem uma consequência prática em assinatura e comparação. A canonicalização existe porque dois documentos XML logicamente idênticos podem diferir byte a byte — ordem de atributos, espaços em branco, declarações de namespace — e uma assinatura cobre bytes. É por isso que a verificação de assinatura XML é sutil de um jeito que a de JSON não é, e por que um documento que "parece igual" pode falhar na verificação por motivos invisíveis num diff.