Benötigt eine gültige XML-Datei eine XML-Deklaration?

122

Ich analysiere eine XML-Datei mit Sax Parser of Xerces.
Ist die XML-Deklaration <?xml version="1.0" encoding="UTF-8"?>erforderlich?

Eros
quelle
3
Es gibt einen Unterschied zwischen gültigen und wohlgeformten Dokumenten. Welche davon meinst du?
Felix Kling
Ich erhalte einen Prologfehler / eine ungültige utf-8-Codierung. Dann fand ich Stückliste in XML-Datei, die der Benutzer die Datei mit Notepad öffnet (ich kann dies nicht vermeiden). Ich bin nicht sicher, ob ich mich auf gültige oder wohlgeformte Dokumente beziehe. Ich muss nur die Fehler vermeiden, deshalb erstelle ich eine Funktion, die alle Bytes vor "<" entfernt. Was ich brauche, um sicherzustellen, dass XML-Header-Deklaration erforderlich ist. Was denkt ihr Leute?
Eros
Gibt es eine Java-Klasse, in der Stücklisten entfernt werden? oder wenige Bytes aus der XML-Datei? von InputStream. Ich denke an die Überspringmethode von FilterInputStream & PushbackInputStream, habe aber keine Ahnung, wie ich sie verwenden soll.
Eros
@eros: " Ich bin nicht sicher, ob ich mich auf ein gültiges oder wohlgeformtes Dokument beziehe. " Eine kurze Erklärung des Unterschieds finden Sie unter Gut geformtes oder gültiges XML .
kjhughes

Antworten:

184

In XML 1.0, die XML - Deklaration ist optional . Siehe Abschnitt 2.8 der XML 1.0-Empfehlung , in dem es heißt, dass es "verwendet werden sollte" - was bedeutet, dass es empfohlen, aber nicht obligatorisch ist. In XML 1.1 ist die Deklaration jedoch obligatorisch . Siehe Abschnitt 2.8 der XML 1.1-Empfehlung , in dem "MUSS" verwendet werden muss. Es geht sogar noch weiter , dass , wenn die Erklärung nicht vorhanden ist, dass das Dokument automatisch impliziert ein XML 1.0 - Dokument ist.

Beachten Sie, dass in einer XML-Deklaration die encodingund standalonebeide optional sind. Nur das versionist obligatorisch. Dies sind auch keine Attribute. Wenn sie also vorhanden sind, müssen sie in dieser Reihenfolge sein: versiongefolgt von einem encoding, gefolgt von einem 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"?>

Wenn Sie die Codierung nicht auf diese Weise angeben, versuchen XML-Parser zu erraten, welche Codierung verwendet wird. Die XML 1.0-Empfehlung beschreibt eine Möglichkeit, wie die Zeichenkodierung automatisch erkannt werden kann . In der Praxis ist dies kein großes Problem, wenn die Eingabe als UTF-8, UTF-16 oder US-ASCII codiert ist. Die automatische Erkennung funktioniert nicht, wenn 8-Bit-Codierungen auftreten, die Zeichen außerhalb des US-ASCII-Bereichs verwenden (z. B. ISO 8859-1). Vermeiden Sie diese, wenn möglich.

Das standalonegibt an, ob das XML-Dokument ohne DTD korrekt verarbeitet werden kann oder nicht. Leute benutzen es selten. Heutzutage ist es schlecht, ein XML-Format zu entwerfen, in dem Informationen ohne DTD fehlen.

Aktualisieren:

Ein Fehler "Prologfehler / ungültige utf-8-Codierung" zeigt an, dass die tatsächlichen Daten, die der Parser in der Datei gefunden hat, nicht mit der Codierung übereinstimmen, die in der XML-Deklaration angegeben ist. In einigen Fällen stimmten die Daten in der Datei nicht mit der automatisch erkannten Codierung überein.

Da Ihre Datei eine Byte-Order-Mark (BOM) enthält, sollte sie in UTF-16-Codierung vorliegen. Ich vermute, dass Ihre Erklärung besagt, <?xml version="1.0" encoding="UTF-8"?>was offensichtlich falsch ist, wenn die Datei von NotePad in UTF-16 geändert wurde. Die einfache Lösung besteht darin, das zu entfernen encodingund einfach zu sagen <?xml version="1.0"?>. Sie können es auch bearbeiten, um zu sagen, encoding="UTF-16"aber das wäre falsch für die Originaldatei (die nicht in UTF-16 enthalten war) oder wenn die Datei irgendwie wieder in UTF-8 oder eine andere Codierung geändert wird.

Versuchen Sie nicht, die Stückliste zu entfernen - das ist nicht die Ursache des Problems. Die Verwendung von NotePad oder WordPad zum Bearbeiten von XML ist das eigentliche Problem!

Hoylen
quelle
Meine Frage wurde beantwortet, meine Folgefrage jedoch nicht. Muss ich dafür eine andere Frage erstellen? oder bitte hier hinzufügen.
Eros
5
Die Stückliste kann die Ursache des Problems sein. Einige ältere XML-Parser akzeptieren zu Beginn eines UTF-8-Dokuments keine Stückliste (es wurde für UTF-16 entwickelt und erst später mit UTF-8 akzeptiert). Es ist jedoch unwahrscheinlich, dass dies ein Problem darstellt, wenn Sie eine neuere Version von Xerces verwenden.
Michael Kay
Beachten Sie auch, dass Sie im Dialogfeld "Speichern unter" im Editor auswählen können, unter welcher Codierung Ihr XML gespeichert werden soll. Wenn Sie die Stückliste entfernen möchten, speichern Sie sie einfach als "ASCII" (vorausgesetzt, Sie verwenden keine Unicode-Zeichen). Für die unteren 127 Zeichen sind ASCII und UTF-8 identisch.
BrainSlugs83
8

Die XML-Deklaration ist optional, sodass Ihre XML-Datei ohne sie deklariert ist. Es wird jedoch empfohlen, es zu verwenden, damit die Parser keine falschen Annahmen treffen, insbesondere was die verwendete Codierung betrifft.

Aravind Yarram
quelle
3
Bin ich der einzige, der es bizarr findet, XML-Parsern mitzuteilen, welche Codierung verwendet werden soll, nachdem sie bereits mit der Decodierung Ihres Dokuments begonnen haben? Ich meine klar, wenn es dieses Tag analysieren und verstehen kann, was es sagt, dann hat es bereits die richtige Codierung herausgefunden. Ich kann mir keine legitime Verwendung für das Codierungsattribut vorstellen.
BrainSlugs83
2
@ BrainSlugs83 In keiner Stückliste wird die Codierung als 8-Bit angegeben. Also entweder ASCII oder UTF-8 oder eine von ihnen alte 8-Bit-Nationalcodierung. Die XML-Deklaration besteht ausschließlich aus 8-Bit der unteren Hälfte, was für alle diese Codierungen gleich ist und genügend Informationen liefert, um die obere Hälfte auszuwählen. Nicht das beste Design, aber immer noch besser als zwischen CP1241 und CP866 zu raten, wie es früher für Textdateien üblich war.
Eugene Ryabtsev
Aber sie hätten sauber werden und sagen sollen, XML sei UTF-8 - Ende der Geschichte.
Lothar
3

Dies ist nur erforderlich, wenn Sie nicht die Standardwerte für versionund verwenden encoding(in diesem Beispiel).

QUentin
quelle