Czy prawidłowy plik XML wymaga deklaracji XML?


122

Analizuję plik XML przy użyciu Sax Parser of Xerces.
Czy <?xml version="1.0" encoding="UTF-8"?>wymagana jest deklaracja XML ?


3
Istnieje różnica między ważnymi a dobrze sformułowanymi dokumentami. Który z nich masz na myśli?
Felix Kling

Otrzymuję błąd prologu / nieprawidłowe kodowanie utf-8. Następnie znalazłem BOM w pliku XML, który użytkownik otwiera za pomocą notatnika (nie mogę tego uniknąć). nie jestem pewien, czy mam na myśli ważne lub dobrze sformułowane dokumenty. Muszę tylko uniknąć błędów, dlatego tworzę funkcję, która usuwa wszystkie bajty przed „<”. Które muszę upewnić się, że deklaracja nagłówka xml jest wymagana. Co myślicie, chłopaki?
eros

Czy istnieje klasa Java, która usuwa BOM? czy kilka bajtów z pliku xml? z InputStream. Myślę o pomijaniu metody z FilterInputStream i PushbackInputStream, ale nie mam pojęcia, jak go używać.
eros

@eros: „ Nie jestem pewien, czy odnoszę się do prawidłowego lub poprawnie sformułowanego dokumentu ” Zobacz Dobrze sformułowany a prawidłowy kod XML, aby uzyskać zwięzłe wyjaśnienie różnicy.
kjhughes

Odpowiedzi:


184

W XML 1.0 deklaracja XML jest opcjonalna . Zobacz sekcję 2.8 Zalecenia XML 1.0 , gdzie jest napisane, że „powinno” być używane - co oznacza, że ​​jest zalecane, ale nie obowiązkowe. Jednak w XML 1.1 deklaracja jest obowiązkowa . Zobacz sekcję 2.8 Zalecenia XML 1.1 , gdzie jest napisane „MUSI” być użyte. To nawet dalej stwierdza, że jeśli deklaracja jest nieobecny, to automatycznie oznacza, że dokument jest dokumentem XML 1.0.

Należy zauważyć, że w XML Deklaracjaencoding i standaloneoba opcjonalne. Tylko versionjest obowiązkowe. Nie są to również atrybuty, więc jeśli są obecne, muszą być w tej kolejności version:, po którym następuje dowolny encoding, a następnie dowolny 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"?>

Jeśli nie określisz kodowania w ten sposób, parsery XML będą próbowały odgadnąć, jakie kodowanie jest używane. Zalecenie XML 1.0 opisuje jeden z możliwych sposobów automatycznego wykrywania kodowania znaków . W praktyce nie stanowi to większego problemu, jeśli dane wejściowe są zakodowane jako UTF-8, UTF-16 lub US-ASCII. Autodetekcja nie działa, gdy napotka 8-bitowe kodowanie, które używa znaków spoza zakresu US-ASCII (np. ISO 8859-1) - unikaj ich tworzenia, jeśli możesz.

standaloneWskazuje, czy dokument XML może być prawidłowo przetwarzane bez DTD czy nie. Ludzie rzadko go używają. Obecnie projektowanie formatu XML, w którym brakuje informacji bez jego DTD, jest złe.

Aktualizacja:

Błąd „prologu / nieprawidłowe kodowanie utf-8” wskazuje, że rzeczywiste dane znalezione w pliku przez parser nie pasują do kodowania, o którym mówi deklaracja XML. W niektórych przypadkach dane w pliku nie pasują do automatycznie wykrytego kodowania.

Ponieważ twój plik zawiera znak kolejności bajtów (BOM), powinien być zakodowany w UTF-16. Podejrzewam, że twoja deklaracja mówi, <?xml version="1.0" encoding="UTF-8"?>co jest oczywiście błędne, gdy plik został zmieniony na UTF-16 przez NotePad. Prostym rozwiązaniem jest usunięcie encodingi po prostu powiedz <?xml version="1.0"?>. Możesz również edytować to, aby powiedzieć, encoding="UTF-16"ale byłoby to złe dla oryginalnego pliku (który nie był w UTF-16) lub gdyby plik został w jakiś sposób zmieniony z powrotem na UTF-8 lub inne kodowanie.

Nie przejmuj się próbą usunięcia BOM - to nie jest przyczyna problemu. Używanie NotePada lub WordPada do edycji XML to prawdziwy problem!


Odpowiedziano na moje pytanie, ale na następne pytanie nie. Czy muszę w tym celu utworzyć kolejne pytanie? lub dodaj go tutaj.
eros

5
BOM może być przyczyną problemu. Niektóre starsze parsery XML nie akceptują BOM na początku dokumentu UTF-8 (został zaprojektowany dla UTF-16 i został zaakceptowany dopiero później w UTF-8). Ale jest mało prawdopodobne, aby stanowił problem, jeśli używasz najnowszej wersji Xerces.
Michael Kay,

Zwróć również uwagę, że w oknie dialogowym „Zapisz jako” w notatniku możesz wybrać kodowanie, w jakim chcesz zapisać swój XML. Jeśli chcesz usunąć BOM, po prostu zapisz jako „ASCII” (zakładając, że nie używasz żadnych znaków Unicode). Dla mniejszych 127 znaków ASCII i UTF-8 są identyczne.
BrainSlugs83

8

Deklaracja XML jest opcjonalna, więc bez niej Twój XML jest poprawnie sformułowany. Zaleca się jednak, aby go używać, aby parsery nie poczyniły błędnych założeń, w szczególności dotyczących zastosowanego kodowania.


3
Czy tylko ja uważam za dziwne, że mówisz parserom XML, jakiego kodowania użyć, kiedy już rozpoczęli dekodowanie twojego dokumentu? Mam na myśli jasno, że jeśli potrafi przeanalizować ten tag i zrozumieć, co mówi, to już zorientował się, jakie jest prawidłowe kodowanie. Nie przychodzi mi do głowy żadne uzasadnione użycie atrybutu kodowania.
BrainSlugs83

2
@ BrainSlugs83 W żadnym BOM kodowanie nie jest określone jako 8-bitowe. Czyli ASCII lub UTF-8 lub którekolwiek z nich stare 8-bitowe kodowanie krajowe. Deklaracja XML ma całą dolną połowę 8-bitową, co jest równe we wszystkich tych kodowaniach i przekazuje wystarczającą ilość informacji, aby wybrać górną połowę. Nie jest to najlepszy projekt, ale wciąż lepszy niż zgadywanie między, powiedzmy, CP1241 i CP866, jak to było typowe dla plików tekstowych z tamtych czasów.
Eugene Ryabtsev

Ale powinni byli oczyścić się i powiedzieć, że XML to UTF-8 - koniec historii.
Lothar,

3

Jest to wymagane tylko wtedy, gdy nie używasz domyślnych wartości versioni encoding(których używasz w tym przykładzie).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.