¿Un archivo XML válido requiere una declaración XML?

122

Estoy analizando un archivo XML usando Sax Parser of Xerces.
¿Se <?xml version="1.0" encoding="UTF-8"?>requiere la declaración XML ?

Eros
fuente
3
Hay una diferencia entre documentos válidos y bien formados. ¿A cuál de esos te refieres?
Felix Kling
Recibo un error de prólogo / codificación utf-8 no válida. Luego encontré BOM en el archivo XML que el usuario abrió el archivo usando el bloc de notas (no puedo evitar esto). No estoy seguro de que me refiero a documentos válidos o bien formados. Solo necesito evitar los errores, por eso estoy creando una función que elimine todos los bytes antes de "<". Lo cual necesito para asegurarme de que se requiere la declaración de encabezado xml. ¿Qué piensan chicos?
eros
¿Existe una clase de Java para eliminar BOM? o unos pocos bytes del archivo xml? de InputStream. Estoy pensando en el método de omisión de FilterInputStream y PushbackInputStream, pero no tengo idea de cómo usarlo.
eros
@eros: " No estoy seguro de que me refiero a documentos válidos o bien formados ". Consulte XML bien formado o válido para obtener una explicación concisa de la diferencia.
kjhughes

Respuestas:

184

En XML 1.0, la Declaración XML es opcional . Ver sección 2.8 de la Recomendación XML 1.0 , donde dice que "debería" usarse, lo que significa que se recomienda, pero no es obligatorio. En XML 1.1, sin embargo, la declaración es obligatoria . Consulte la sección 2.8 de la Recomendación XML 1.1 , donde dice "DEBE" ser utilizado. Incluso continúa diciendo que si la declaración está ausente, eso automáticamente implica que el documento es un documento XML 1.0.

Tenga en cuenta que en una Declaración XML el encodingystandalone son opcionales. Solo el versiones obligatorio. Además, estos no son atributos, por lo que si están presentes deben estar en ese orden: versionseguidos de cualquiera encoding, seguidos de cualquiera 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 no especifica la codificación de esta manera, los analizadores XML intentan adivinar qué codificación se está utilizando. La Recomendación XML 1.0 describe una posible forma en que la codificación de caracteres se puede detectar automáticamente . En la práctica, esto no es un gran problema si la entrada está codificada como UTF-8, UTF-16 o US-ASCII. La detección automática no funciona cuando encuentra codificaciones de 8 bits que usan caracteres fuera del rango US-ASCII (por ejemplo, ISO 8859-1). Evite crearlos si puede.

El standaloneindica si el documento XML se puede procesar correctamente sin el DTD o no. La gente rara vez lo usa. En estos días, es malo diseñar un formato XML al que le falta información sin su DTD.

Actualizar:

Un error de "error de prólogo / codificación utf-8 no válida" indica que los datos reales que el analizador encontró dentro del archivo no coincidían con la codificación que la declaración XML dice que es. O, en algunos casos, los datos dentro del archivo no coincidían con la codificación autodetectada.

Como su archivo contiene una marca de orden de bytes (BOM), debe estar en codificación UTF-16. Sospecho que su declaración dice <?xml version="1.0" encoding="UTF-8"?>que obviamente es incorrecto cuando NotePad ha cambiado el archivo a UTF-16. La solución simple es eliminar el encodingy simplemente decir <?xml version="1.0"?>. También puede editarlo para decirlo, encoding="UTF-16"pero eso sería incorrecto para el archivo original (que no estaba en UTF-16) o si el archivo de alguna manera vuelve a cambiarse a UTF-8 o alguna otra codificación.

No se moleste en tratar de eliminar la lista de materiales, esa no es la causa del problema. ¡Usar NotePad o WordPad para editar XML es el verdadero problema!

Hoylen
fuente
Mi pregunta fue respondida pero mi pregunta de seguimiento no. ¿Necesito crear otra pregunta para eso? o por favor agrégalo aquí.
eros
55
La lista de materiales puede ser la causa del problema. Algunos analizadores XML más antiguos no aceptarán una lista de materiales al comienzo de un documento UTF-8 (fue diseñado para UTF-16, y solo se volvió aceptable con UTF-8 más adelante). Pero es poco probable que sea un problema si está utilizando una versión reciente de Xerces.
Michael Kay
También tenga en cuenta que en el cuadro de diálogo "Guardar como" en el bloc de notas puede elegir qué codificación guardar su XML como. Si desea eliminar la lista de materiales, simplemente guárdela como "ASCII" (suponiendo que no esté utilizando ningún carácter Unicode). Para los 127 caracteres inferiores, ASCII y UTF-8 son idénticos.
BrainSlugs83
8

La declaración XML es opcional, por lo que su XML está bien formado sin ella. Pero se recomienda usarlo para que los analizadores no hagan suposiciones incorrectas, específicamente sobre la codificación utilizada.

Aravind Yarram
fuente
3
¿Soy el único que encuentra extraño que le diga a los analizadores XML qué codificación usar después de que ya hayan comenzado a decodificar su documento? Quiero decir claramente, si puede analizar esa etiqueta y entender lo que dice, entonces ya ha descubierto la codificación correcta. No se me ocurre ningún uso legítimo para el atributo de codificación.
BrainSlugs83
2
@ BrainSlugs83 En ninguna lista de materiales, la codificación se especifica como 8 bits. Entonces, ya sea ASCII o UTF-8 o cualquiera de ellos, antigua codificación nacional de 8 bits. La declaración XML es la mitad inferior de 8 bits, que es igual entre todas esas codificaciones y transmite suficiente información para elegir la mitad superior. No es el mejor diseño, pero aún mejor que adivinar entre, digamos, CP1241 y CP866, como era común para los archivos de texto de ellos en los viejos tiempos.
Eugene Ryabtsev
Pero deberían haberse aclarado y decir que XML es UTF-8: fin de la historia.
Lothar
3

Solo es necesario si no está utilizando los valores predeterminados para versiony encoding(que está en ese ejemplo).

Quentin
fuente