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?


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!


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.


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).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.