it-swarm.dev

Um arquivo XML válido requer uma declaração XML?

Estou analisando um arquivo XML usando o Sax Parser of Xerces.
A declaração XML <?xml version="1.0" encoding="UTF-8"?> é necessária?

112
eros

No XML 1.0, a Declaração XML é opcional . Veja seção 2.8 da Recomendação XML 1. , onde diz que "deve" ser usado - o que significa que é recomendado, mas não obrigatório. No XML 1.1, no entanto, a declaração é obrigatória . Veja seção 2.8 da Recomendação XML 1.1 , onde diz "DEVE" ser usado. Ele até mesmo afirma que if a declaração está ausente, isso automaticamente implica que o documento é um documento XML 1.0.

Note que em uma Declaração XML , o encoding e standalone são ambos opcionais. Apenas o version é obrigatório. Além disso, estes não são atributos, portanto, se estiverem presentes, devem estar nessa ordem: version, seguido por qualquer encoding, seguido por qualquer standalone.

<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" standalone="yes"?>
<?xml version="1.0" encoding="UTF-16" standalone="yes"?>

Se você não especificar a codificação dessa maneira, os analisadores XML tentarão adivinhar qual codificação está sendo usada. A recomendação XML 1.0 descreve uma maneira possível: a codificação de caracteres pode ser autodetectada . Na prática, isso não é um grande problema se a entrada for codificada como UTF-8, UTF-16 ou US-ASCII. A detecção automática não funciona quando encontra codificações de 8 bits que usam caracteres fora do intervalo US-ASCII (por exemplo, ISO 8859-1) - evite criá-las se possível.

O standalone indica se o documento XML pode ser processado corretamente sem o DTD ou não. As pessoas raramente usam isso. Atualmente, é ruim projetar um formato XML que esteja faltando informações sem seu DTD.

Atualizar:

Um erro "erro de prólogo/codificação utf-8 inválida" indica que os dados reais que o analisador encontrou dentro do arquivo não correspondem à codificação que a declaração XML diz que é. Ou, em alguns casos, os dados dentro do arquivo não correspondem à codificação autodetectada.

Como seu arquivo contém uma marca de ordem de byte (BOM), ele deve estar na codificação UTF-16. Eu suspeito que sua declaração diz <?xml version="1.0" encoding="UTF-8"?> que está obviamente incorreta quando o arquivo foi alterado para UTF-16 pelo NotePad. A solução simples é remover o encoding e simplesmente dizer <?xml version="1.0"?>. Você também pode editá-lo para dizer encoding="UTF-16", mas isso seria errado para o arquivo original (que não estava em UTF-16) ou se o arquivo de alguma forma for alterado de volta para UTF-8 ou alguma outra codificação.

Não se incomode em tentar remover o BOM - essa não é a causa do problema. Usando o NotePad ou WordPad para editar XML é o problema real!

169
Hoylen

A declaração Xml é opcional, então o seu xml é bem formado sem ele. Mas é recomendável usá-lo para que suposições erradas não sejam feitas pelos analisadores, especificamente sobre a codificação usada.

8
Aravind R. Yarram

Só é necessário se você não estiver usando os valores padrão para version e encoding (que você está nesse exemplo).

3
Quentin