Duas palavras diferentes são usadas para XML "correto", e elas significam coisas diferentes. Confundi-las leva a muito debugging desperdiçado.

Bem formado

Bem formado é a linha de base que todo documento XML precisa cumprir para ser XML afinal. As regras são sintáticas:

  • Há exatamente um elemento raiz contendo todo o resto.
  • Todo elemento tem uma tag de fechamento correspondente, ou é de auto-fechamento. <b> precisa ser fechado por </b>.
  • Elementos são aninhados corretamente: <a><b></b></a> está certo, <a><b></a></b> não está, porque o elemento interno precisa fechar antes do externo.
  • Valores de atributo são entre aspas, com aspas simples ou duplas, e um elemento não pode repetir um nome de atributo.
  • Os caracteres especiais < e & são escapados no texto (como &lt; e &amp;), porque crus eles iniciariam uma tag ou uma entidade.

Um documento que quebra qualquer uma destas não é bem formado, e um parser XML conforme precisa rejeitá-lo em vez de adivinhar a intenção do autor. Essa rigidez é deliberada: é a diferença entre XML e a recuperação de erros tolerante do HTML.

Válido

Válido é uma afirmação mais forte e inteiramente separada. Um documento é válido quando, além de bem formado, ele está em conformidade com um schema, um conjunto de regras descrevendo quais elementos são permitidos, em que ordem, com quais atributos e tipos de dados. Schemas vêm em vários sabores: o mais antigo DTD, e o mais expressivo XML Schema (XSD) e RELAX NG. Validação é o que pega "este documento é sintaticamente correto mas um <book> está sem seu <title> obrigatório".

Por que a distinção importa

A relação chave é que validade pressupõe boa formação mas não o contrário. Um documento pode ser perfeitamente bem formado e ainda inválido contra um schema, e a maioria das ferramentas que "parseiam" XML só verifica boa formação a menos que você peça explicitamente para validar. Então quando algo rejeita seu XML, a primeira pergunta é qual barra ele falhou: um erro de boa formação é um erro de sintaxe no próprio documento, enquanto um erro de validade significa que a sintaxe está correta mas o conteúdo não corresponde ao schema contra o qual foi verificado. Eles são corrigidos em lugares diferentes.