Un fichier XML valide nécessite-t-il une déclaration XML?

122

J'analyse un fichier XML à l'aide de Sax Parser de Xerces.
La déclaration XML est-elle <?xml version="1.0" encoding="UTF-8"?>requise?

Éros
la source
3
Il y a une différence entre des documents valides et bien formés. De quoi parlez-vous?
Felix Kling
Je reçois une erreur de prologue / un encodage utf-8 invalide. Ensuite, j'ai trouvé la nomenclature dans un fichier XML que l'utilisateur ouvre le fichier à l'aide du bloc-notes (je ne peux pas éviter cela). je ne suis pas sûr de faire référence à un document valide ou bien formé. Juste besoin d'éviter les erreurs, c'est pourquoi je crée une fonction qui supprime tous les octets avant "<". Ce dont j'ai besoin pour m'assurer que la déclaration d'en-tête xml est requise. Que pensez-vous les gars?
eros
Existe-t-il une classe Java pour supprimer la nomenclature? ou quelques octets du fichier xml? de InputStream. Je pense à la méthode skip de FilterInputStream & PushbackInputStream mais je n'ai aucune idée de comment l'utiliser.
eros
@eros: " Je ne suis pas sûr de faire référence à un document valide ou bien formé " Voir XML bien formé vs valide pour une explication concise de la différence.
kjhughes

Réponses:

184

Dans XML 1.0, la déclaration XML est facultative . Voir la section 2.8 de la recommandation XML 1.0 , où elle dit qu'il "devrait" être utilisé - ce qui signifie qu'il est recommandé, mais pas obligatoire. Dans XML 1.1, cependant, la déclaration est obligatoire . Voir la section 2.8 de la recommandation XML 1.1 , où il est dit "DOIT" être utilisé. Il continue même en disant que si déclarant la déclaration est absente, cela implique automatiquement que le document est un document XML 1.0.

Notez que dans une déclaration XML, les encodinget standalonesont tous deux facultatifs. Seul le versionest obligatoire. De plus, ce ne sont pas des attributs, donc s'ils sont présents, ils doivent être dans cet ordre:, versionsuivi de any encoding, suivi de any 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"?>

Si vous ne spécifiez pas l'encodage de cette manière, les analyseurs XML essaient de deviner quel encodage est utilisé. La recommandation XML 1.0 décrit une manière possible de détecter automatiquement le codage des caractères . En pratique, ce n'est pas vraiment un problème si l'entrée est codée en UTF-8, UTF-16 ou US-ASCII. La détection automatique ne fonctionne pas lorsqu'elle rencontre des encodages 8 bits qui utilisent des caractères en dehors de la plage US-ASCII (par exemple ISO 8859-1) - évitez de les créer si vous le pouvez.

Le standaloneindique si le document XML peut être correctement traité sans la DTD ou non. Les gens l'utilisent rarement. De nos jours, c'est mal de concevoir un format XML qui manque d'informations sans sa DTD.

Mettre à jour:

Une erreur "erreur de prologue / encodage utf-8 invalide" indique que les données réelles que l'analyseur a trouvées à l'intérieur du fichier ne correspondaient pas au codage indiqué dans la déclaration XML. Ou dans certains cas, les données à l'intérieur du fichier ne correspondaient pas au codage détecté automatiquement.

Puisque votre fichier contient une marque d'ordre d'octet (BOM), il doit être en codage UTF-16. Je soupçonne que votre déclaration dit <?xml version="1.0" encoding="UTF-8"?>ce qui est évidemment incorrect lorsque le fichier a été changé en UTF-16 par NotePad. La solution simple est de supprimer le encodinget de dire simplement <?xml version="1.0"?>. Vous pouvez également le modifier pour dire, encoding="UTF-16"mais ce serait faux pour le fichier d'origine (qui n'était pas en UTF-16) ou si le fichier est d'une manière ou d'une autre changé en UTF-8 ou un autre encodage.

N'essayez pas de supprimer la nomenclature - ce n'est pas la cause du problème. Utiliser NotePad ou WordPad pour éditer XML est le vrai problème!

Hoylen
la source
Ma question a reçu une réponse, mais pas ma question suivante. Dois-je créer une autre question pour cela? ou veuillez l'ajouter ici.
eros
5
La nomenclature peut être la cause du problème. Certains analyseurs XML plus anciens n'accepteront pas de nomenclature au début d'un document UTF-8 (il a été conçu pour UTF-16, et n'est devenu acceptable qu'avec UTF-8 plus tard). Mais il est peu probable que ce soit un problème si vous utilisez une version récente de Xerces.
Michael Kay
Notez également que dans la boîte de dialogue "Enregistrer sous" du bloc-notes, vous pouvez choisir le codage sous lequel enregistrer votre XML. Si vous souhaitez supprimer la nomenclature, enregistrez-la simplement sous "ASCII" (en supposant que vous n'utilisez aucun caractère Unicode). Pour les 127 caractères inférieurs, ASCII et UTF-8 sont identiques.
BrainSlugs83
8

La déclaration XML est facultative afin que votre XML soit bien formé sans elle. Mais il est recommandé de l'utiliser pour que les analyseurs ne fassent pas d'hypothèses erronées, en particulier sur l'encodage utilisé.

Aravind Yarram
la source
3
Suis-je le seul à trouver bizarre que vous disiez aux analyseurs XML quel encodage utiliser après qu'ils aient déjà commencé à décoder votre document? Je veux dire clairement, s'il peut analyser cette balise et comprendre ce qu'elle dit, alors il a déjà trouvé le bon encodage. Je ne peux penser à aucune utilisation légitime de l'attribut encoding.
BrainSlugs83
2
@ BrainSlugs83 Dans aucune nomenclature, le codage est spécifié sur 8 bits. Donc, soit ASCII ou UTF-8, soit l'un de ces anciens encodages nationaux 8 bits. La déclaration XML est toute la moitié inférieure de 8 bits, ce qui est égal parmi tous ces encodages et transmet suffisamment d'informations pour choisir la moitié supérieure. Pas le meilleur du design, mais toujours mieux que de deviner entre, par exemple, CP1241 et CP866, comme c'était courant pour les fichiers texte de ces temps anciens.
Eugene Ryabtsev
Mais ils auraient dû être clairs et dire que XML est UTF-8 - fin de l'histoire.
Lothar
3

Il n'est requis que si vous n'utilisez pas les valeurs par défaut pour versionet encoding(que vous êtes dans cet exemple).

Quentin
la source