Przez ostatnie 48 godzin waliłem głową w ten absolutnie irytujący błąd, więc pomyślałem, że w końcu rzucę ręcznik i spróbuję zapytać tutaj, zanim wyrzucę laptopa przez okno.
Próbuję przeanalizować XML odpowiedzi z połączenia, które wykonałem do AWS SimpleDB. Odpowiedź wraca na drut w porządku; na przykład może wyglądać tak:
<?xml version="1.0" encoding="utf-8"?>
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/">
<ListDomainsResult>
<DomainName>Audio</DomainName>
<DomainName>Course</DomainName>
<DomainName>DocumentContents</DomainName>
<DomainName>LectureSet</DomainName>
<DomainName>MetaData</DomainName>
<DomainName>Professors</DomainName>
<DomainName>Tag</DomainName>
</ListDomainsResult>
<ResponseMetadata>
<RequestId>42330b4a-e134-6aec-e62a-5869ac2b4575</RequestId>
<BoxUsage>0.0000071759</BoxUsage>
</ResponseMetadata>
</ListDomainsResponse>
Przekazuję ten XML do parsera z
XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());
i dzwonię eventReader.nextEvent();
kilka razy, aby uzyskać potrzebne dane.
Oto dziwna część - działa świetnie na lokalnym serwerze. Nadchodzi odpowiedź, analizuję ją, wszyscy są szczęśliwi. Problem polega na tym, że kiedy wdrażam kod w Google App Engine, żądanie wychodzące nadal działa, a XML odpowiedzi wydaje mi się w 100% identyczny i poprawny, ale odpowiedź nie jest analizowana z następującym wyjątkiem:
com.amazonaws.http.HttpClient handleResponse: Unable to unmarshall response (ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.): <?xml version="1.0" encoding="utf-8"?>
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/"><ListDomainsResult><DomainName>Audio</DomainName><DomainName>Course</DomainName><DomainName>DocumentContents</DomainName><DomainName>LectureSet</DomainName><DomainName>MetaData</DomainName><DomainName>Professors</DomainName><DomainName>Tag</DomainName></ListDomainsResult><ResponseMetadata><RequestId>42330b4a-e134-6aec-e62a-5869ac2b4575</RequestId><BoxUsage>0.0000071759</BoxUsage></ResponseMetadata></ListDomainsResponse>
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(Unknown Source)
at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(Unknown Source)
at com.amazonaws.transform.StaxUnmarshallerContext.nextEvent(StaxUnmarshallerContext.java:153)
... (rest of lines omitted)
Podwójnie, potrójnie, poczwórnie sprawdziłem ten XML pod kątem „niewidocznych znaków” lub znaków zakodowanych w formacie innym niż UTF8 itp. Spojrzałem na to bajt po bajcie w tablicy pod kątem znaków kolejności bajtów lub czegoś w tym rodzaju. Nic; przechodzi wszystkie testy walidacyjne, jakie mogłem mu rzucić. Co dziwniejsze, dzieje się tak, gdy używam również parsera opartego na Saksonii - ale TYLKO w GAE, zawsze działa dobrze w moim lokalnym środowisku.
Utrudnia to śledzenie kodu pod kątem problemów, gdy mogę uruchomić debugger tylko w środowisku, które działa idealnie (nie znalazłem żadnego dobrego sposobu na zdalne debugowanie w GAE). Niemniej jednak, używając prymitywnych środków, które posiadam, wypróbowałem milion podejść, w tym:
- XML z prologiem i bez niego
- Z nowymi liniami i bez
- Z atrybutem „encoding =” w prologu i bez niego
- Oba style nowej linii
- Z i bez informacji o porcjowaniu obecnych w strumieniu HTTP
Wypróbowałem większość z nich w wielu kombinacjach, w których miało sens, aby wchodziły w interakcje - nic! Jestem na końcu mojego dowcipu. Czy ktoś widział wcześniej taki problem, który, miejmy nadzieję, może rzucić na to trochę światła?
Dzięki!
Odpowiedzi:
Kodowanie w Twoim XML i XSD (lub DTD) jest różne.
Nagłówek pliku XML:
<?xml version='1.0' encoding='utf-8'?>
nagłówek pliku XSD:
<?xml version='1.0' encoding='utf-16'?>
Innym możliwym scenariuszem, który powoduje to, jest sytuacja, gdy cokolwiek występuje przed deklaracją typu dokumentu XML. tj. możesz mieć coś takiego w buforze:
lub nawet spacja lub znak specjalny.
Istnieje kilka znaków specjalnych zwanych znacznikami kolejności bajtów, które mogą znajdować się w buforze. Przed przekazaniem bufora do Parsera zrób to ...
źródło
Ten komunikat o błędzie jest zawsze spowodowany nieprawidłową treścią XML w elemencie początkowym. Na przykład bardzo mała kropka „.” na początku elementu XML.
Wszelkie znaki przed „
<?xml….
” spowodują powyższy komunikat o błędzie „ org.xml.sax.SAXParseException: Content is not allowed in prolog ”.Mała kropka ” . " zanim
“<?xml….
Aby to naprawić, po prostu usuń wszystkie te dziwne znaki przed rozszerzeniem
“<?xml“
.Ref: http://www.mkyong.com/java/sax-error-content-is-not-allowed-in-prolog/
źródło
Miałem ten sam problem. W moim przypadku pliki XML zostały wygenerowane z programu C # i przesłane do AS400 w celu dalszego przetwarzania. Po przeprowadzeniu analizy stwierdziłem, że podczas generowania plików XML używam kodowania UTF8, podczas gdy javac (w AS400) używa „UTF8 bez BOM”. Musiałem więc napisać dodatkowy kod podobny do wymienionego poniżej:
źródło
Miałem problem podczas sprawdzania pliku xml w notatniku ++ i zapisywania pliku, chociaż miałem górny znacznik xml utf-8 jako
<?xml version="1.0" encoding="utf-8"?>
Naprawiono, zapisując plik w notpad ++ z Kodowaniem (Tab)> Koduj w UTF-8: zaznaczono (było Kodowanie w UTF-8-BOM)
źródło
Usunięcie deklaracji xml rozwiązało problem
źródło
W moim pliku xml nagłówek wyglądał następująco:
W pliku testowym odczytywałem bajty pliku i dekodowałem dane jako UTF-8 (nie zdając sobie sprawy, że nagłówek w tym pliku to utf-16), aby utworzyć ciąg.
Kiedy próbowałem deserializować ten ciąg na obiekt, widziałem ten sam błąd:
Kiedy zaktualizowałem drugą linię do
Udało mi się zdeserializować obiekt w porządku. Jak więc Romain zauważył powyżej, kodowanie musi pasować.
źródło
Napotkałem ten sam problem o nazwie „Treść nie jest dozwolona w prologu” w moim pliku xml.
Rozwiązanie
Początkowo moim folderem głównym był „# Filename ”.
Kiedy usunąłem pierwszy znak „#”, błąd został rozwiązany.
Nie ma potrzeby usuwania #filename ... Spróbuj w ten sposób ...
Zamiast przekazywać obiekt File lub URL do metody unmarshaller, użyj FileInputStream.
źródło
Nieoczekiwany powód:
#
znak w ścieżce plikuZ powodu jakiegoś wewnętrznego błędu, błąd Treść nie jest dozwolona w prologu pojawia się również, jeśli sama zawartość pliku jest w 100% poprawna, ale podajesz nazwę pliku, taką jak
C:\Data\#22\file.xml
.Może to również dotyczyć innych znaków specjalnych.
Jak sprawdzić: Jeśli przeniesiesz plik do ścieżki bez znaków specjalnych i błąd zniknie, to był to problem.
źródło
Wyłapałem dziś ten sam komunikat o błędzie. Rozwiązaniem była zmiana dokumentu z UTF-8 z BOM na UTF-8 bez BOM
źródło
Zamiast spacji miałem znak tabulacji. Zastąpienie zakładki „\ t” rozwiązało problem.
Wytnij i wklej cały dokument do edytora, takiego jak Notepad ++, i wyświetl wszystkie znaki.
źródło
W moim przypadku rozwiązaniem było zastąpienie niemieckich umlautów (äöü) ich odpowiednikami HTML ...
źródło
poniżej są przyczyną powyżej wyjątku „org.xml.sax.SAXParseException: Content is not allowed in prolog”.
Nagłówek pliku XML:
<?xml version='1.0' encoding='utf-8'?>
nagłówek pliku XSD:
<?xml version='1.0' encoding='utf-8'?>
hello<?xml version='1.0' encoding='utf-16'?>
źródło
W duchu „po prostu usuń wszystkie te dziwne znaki przed <? Xml”, oto mój kod Java, który działa dobrze w przypadku wprowadzania danych przez BufferedReader:
FWIW, bajty, które widziałem to (dziesiętnie): 239, 187, 191.
źródło