Un file XML valido richiede una dichiarazione XML?


122

Sto analizzando un file XML usando Sax Parser of Xerces.
È <?xml version="1.0" encoding="UTF-8"?>richiesta la dichiarazione XML ?


3
C'è una differenza tra documenti validi e ben formati. Quale di questi intendi?
Felix Kling

Ricevo un errore di prologo / codifica utf-8 non valida. Quindi ho trovato BOM nel file XML che l'utente apre il file utilizzando il blocco note (non posso evitarlo). non sono sicuro di riferirmi a documenti validi o ben formati. Devo solo evitare gli errori, ecco perché sto creando una funzione che rimuove tutti i byte prima di "<". Di cui ho bisogno per assicurarmi che sia richiesta la dichiarazione di intestazione xml. Cosa ne pensate ragazzi?
eros

Esiste una classe Java per la rimozione di BOM? o pochi byte dal file xml? da InputStream. Sto pensando al metodo di salto da FilterInputStream e PushbackInputStream ma non ho idea di come usarlo.
eros

@eros: " Non sono sicuro di riferirmi a documenti validi o ben formati " Vedi XML ben formato e valido per una spiegazione concisa della differenza.
kjhughes

Risposte:


184

In XML 1.0, la dichiarazione XML è facoltativa . Vedere la sezione 2.8 della raccomandazione XML 1.0 , dove si dice che "dovrebbe" essere usato - il che significa che è raccomandato, ma non obbligatorio. In XML 1.1, tuttavia, la dichiarazione è obbligatoria . Vedere la sezione 2.8 della raccomandazione XML 1.1 , dove si dice "DEVE" essere usato. Si prosegue anche affermando che se la dichiarazione è assente, ciò implica automaticamente che il documento è un documento XML 1.0.

Si noti che in un XML Dichiarazione del encodinge standalonesono entrambi opzionali. Solo il versionè obbligatorio. Inoltre, questi non sono attributi, quindi se sono presenti devono essere nell'ordine:, versionseguito da any encoding, seguito da 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"?>

Se non si specifica la codifica in questo modo, i parser XML tentano di indovinare quale codifica viene utilizzata. La raccomandazione XML 1.0 descrive un possibile modo in cui la codifica dei caratteri può essere rilevata automaticamente . In pratica, questo non è un grosso problema se l'input è codificato come UTF-8, UTF-16 o US-ASCII. Il rilevamento automatico non funziona quando rileva codifiche a 8 bit che utilizzano caratteri al di fuori dell'intervallo US-ASCII (ad esempio ISO 8859-1): evita di crearli se puoi.

Il standaloneindica se il documento XML può essere elaborato correttamente senza il DTD o meno. Le persone lo usano raramente. In questi giorni, è un male progettare un formato XML a cui mancano informazioni senza il suo DTD.

Aggiornare:

Un errore "errore prologo / codifica utf-8 non valida" indica che i dati effettivi trovati dal parser all'interno del file non corrispondevano alla codifica che la dichiarazione XML dice che è. O in alcuni casi i dati all'interno del file non corrispondevano alla codifica rilevata automaticamente.

Poiché il tuo file contiene un byte-order-mark (BOM), dovrebbe essere nella codifica UTF-16. Sospetto che la tua dichiarazione dica <?xml version="1.0" encoding="UTF-8"?>che è ovviamente errato quando il file è stato modificato in UTF-16 da NotePad. La soluzione semplice è rimuovere il encodinge semplicemente dire <?xml version="1.0"?>. Potresti anche modificarlo per dire, encoding="UTF-16"ma sarebbe sbagliato per il file originale (che non era in UTF-16) o se il file in qualche modo viene modificato di nuovo in UTF-8 o qualche altra codifica.

Non preoccuparti di provare a rimuovere la distinta componenti: non è questa la causa del problema. Usare NotePad o WordPad per modificare XML è il vero problema!


La mia domanda ha avuto risposta ma la mia domanda successiva no. Devo creare un'altra domanda per questo? oppure aggiungilo qui.
eros

5
La distinta base può essere la causa del problema. Alcuni parser XML meno recenti non accetteranno una distinta componenti all'inizio di un documento UTF-8 (è stato progettato per UTF-16 ed è diventato accettabile solo con UTF-8 in seguito). Ma è improbabile che sia un problema se stai usando una versione recente di Xerces.
Michael Kay

Nota inoltre che nella finestra di dialogo "Salva con nome" nel blocco note puoi scegliere con quale codifica salvare il tuo XML. Se vuoi rimuovere la distinta materiali, salva semplicemente come "ASCII" (supponendo che tu non stia utilizzando caratteri Unicode). Per i 127 caratteri inferiori, ASCII e UTF-8 sono identici.
BrainSlugs83

8

La dichiarazione xml è facoltativa, quindi il tuo xml è ben formato senza di essa. Ma si consiglia di usarlo in modo che i parser non facciano supposizioni errate, in particolare sulla codifica utilizzata.


3
Sono l'unico che trova bizzarro che tu dica ai parser XML quale codifica usare dopo che hanno già iniziato a decodificare il tuo documento? Voglio dire chiaramente, se può analizzare quel tag e capire cosa dice, allora ha già capito la codifica corretta. Non riesco a pensare a un uso legittimo dell'attributo di codifica.
BrainSlugs83

2
@ BrainSlugs83 In nessuna distinta materiali, la codifica è specificata a 8 bit. Quindi ASCII o UTF-8 o una qualsiasi delle vecchie codifiche nazionali a 8 bit. La dichiarazione XML è tutta la metà inferiore a 8 bit, che è uguale tra tutte quelle codifiche e trasmette abbastanza informazioni per scegliere la metà superiore. Non il migliore del design, ma comunque meglio che indovinare tra, ad esempio, CP1241 e CP866 come era comune per i file di testo di quei tempi antichi.
Eugene Ryabtsev

Ma avrebbero dovuto essere puliti e dire che XML è UTF-8 - fine della storia.
Lothar

3

È richiesto solo se non stai utilizzando i valori predefiniti per versione encoding(come in quell'esempio).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.