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

122

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

Eros
fonte
3
Há uma diferença entre documentos válidos e bem formados. Qual desses você quer dizer?
Felix Kling
Estou recebendo erro de prólogo / codificação utf-8 inválida. Então eu encontrei o BOM no arquivo XML que o usuário abre o arquivo usando o bloco de notas (não posso evitar isso). não sei se estou me referindo a documentos válidos ou bem formados. Só preciso evitar os erros, por isso estou criando uma função que remove todos os bytes anteriores a "<". O que eu preciso para garantir que a declaração do cabeçalho xml seja necessária. O que vocês acham pessoal?
Eros
Existe uma classe java que remove o BOM? ou alguns bytes do arquivo xml? de InputStream. Estou pensando em pular o método FilterInputStream & PushbackInputStream, mas não tenho idéia de como usá-lo.
eros
@eros: " não sei se estou me referindo a documentos válidos ou bem formados " Consulte XML bem formado x válido para obter uma explicação concisa da diferença.
kjhughes

Respostas:

184

No XML 1.0, a Declaração XML é opcional . Consulte a seção 2.8 da Recomendação do XML 1.0 , 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 . Consulte a seção 2.8 da Recomendação XML 1.1 , onde diz "DEVE" ser usado. Ele ainda afirma que, se a declaração estiver ausente, isso implica automaticamente que o documento é um documento XML 1.0.

Observe que em uma declaração XML, o encodinge standalonesão opcionais. Somente o versioné obrigatório. Além disso, esses 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 de a codificação de caracteres ser detectada automaticamente . Na prática, isso não é muito problemático 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 da faixa US-ASCII (por exemplo, ISO 8859-1) - evite criá-las, se puder.

o standalone indica se o documento XML pode ser processado corretamente sem a DTD ou não. As pessoas raramente usam. Hoje em dia, é ruim projetar um formato XML que esteja faltando informações sem a 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 corresponderam à codificação que a declaração XML diz que é. Ou, em alguns casos, os dados dentro do arquivo não correspondem à codificação detectada automaticamente.

Como seu arquivo contém uma BOM (marca de ordem de bytes), 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 Bloco de Notas. A solução simples é remover o encodinge 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 no UTF-16) ou se o arquivo de alguma forma for alterado novamente para UTF-8 ou alguma outra codificação.

Não se preocupe em tentar remover a lista técnica - essa não é a causa do problema. Usar o Bloco de notas ou o WordPad para editar XML é o verdadeiro problema!

Hoylen
fonte
Minha pergunta foi respondida, mas minha pergunta seguinte não foi. Preciso criar outra pergunta para isso? ou adicione-o aqui.
Eros
5
A lista técnica pode ser a causa do problema. Alguns analisadores XML mais antigos não aceitarão uma lista técnica no início de um documento UTF-8 (ele foi projetado para UTF-16 e só se tornou aceitável com UTF-8 posteriormente). Mas é improvável que seja um problema se você estiver usando uma versão recente do Xerces.
Michael Kay
Observe também que na caixa de diálogo "Salvar como" no bloco de notas você pode escolher qual codificação salvar como XML. Se você deseja remover a lista técnica, salve como "ASCII" (supondo que você não esteja usando nenhum caractere Unicode). Para os 127 caracteres inferiores, ASCII e UTF-8 são idênticos.
precisa saber é o seguinte
8

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

Aravind Yarram
fonte
3
Eu sou o único que acha estranho que você diga aos analisadores XML que codificação usar depois que eles já começaram a decodificar seu documento? Quero dizer claramente, se ele pode analisar essa tag e entender o que diz, então ela já descobriu a codificação correta. Não consigo pensar em nenhum uso legítimo para o atributo de codificação.
BrainSlugs83
2
@ BrainSlugs83 Em nenhuma lista técnica, a codificação é especificada para ser de 8 bits. Portanto, tanto ASCII ou UTF-8 ou qualquer uma delas antiga codificação nacional de 8 bits. A declaração XML é toda a metade inferior de 8 bits, que é igual entre todas essas codificações e transmite informações suficientes para escolher a metade superior. Não é o melhor design, mas ainda melhor do que adivinhar entre, digamos, o CP1241 e o CP866, como era comum nos arquivos de texto dos tempos antigos.
Eugene Ryabtsev
Mas eles deveriam ter ficado limpos e dizer que XML é UTF-8 - fim da história.
Lothar
3

É necessário apenas se você não estiver usando os valores padrão para versione encoding(nos quais você está nesse exemplo).

Quentin
fonte