Analizuję plik XML przy użyciu Sax Parser of Xerces.
Czy <?xml version="1.0" encoding="UTF-8"?>
wymagana jest deklaracja XML ?
Analizuję plik XML przy użyciu Sax Parser of Xerces.
Czy <?xml version="1.0" encoding="UTF-8"?>
wymagana jest deklaracja XML ?
Odpowiedzi:
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 standalone
oba opcjonalne. Tylko version
jest 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.
standalone
Wskazuje, 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 encoding
i 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!
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.