"Content is not allowed in prolog" when parsing perfect valid XML on GAE

Przez ostatnie 48 godzin walałem głową o tego wkurzającego robaka, 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ć odpowiedź XML z połączenia, które wykonałem do AWS SimpleDB. Odpowiedź wraca na drucie po prostu dobrze; 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 zadzwonić eventReader.nextEvent(); kilka razy, aby uzyskać Dane I chcę.

Oto dziwna część -- działa świetnie wewnątrz lokalnego serwera. Odpowiedź przychodzi, analizuję ją, wszyscy są zadowoleni. Problem polega na tym, że gdy wdrażam kod do Google App Engine, wychodzące żądanie nadal działa, a odpowiedź XML wydaje się w 100% identyczna i poprawna dla mnie, ale odpowiedź nie analizuje 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)

Dwukrotnie, trzykrotnie, poczwórnie sprawdziłem ten XML pod kątem 'niewidzialnych znaków' lub nie-UTF8 zakodowanych znaków, itp. I patrzyłem na to bajt-by-bajt w tablicy dla znaków rzędu bajtów lub czegoś takiego. Nic, przechodzi każdy test walidacyjny, jaki mogłem na niego rzucić. Co dziwniejsze, zdarza się, jeśli używam parsera Saskiego , ale tylko na GAE, zawsze działa dobrze w moim lokalnym środowisku.

Sprawia, że bardzo trudno jest wyśledzić kod 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 na GAE). Niemniej jednak, korzystając z primitive znaczy mam, próbowałem milion podejść w tym:

  • XML z i bez prologu
  • Z i bez nowych linii
  • Z i bez atrybutu "encoding=" w prologu
  • oba style newline
  • Z i bez informacji chunking obecnych w strumieniu HTTP
Próbowałem większości z nich w wielu kombinacjach, gdzie miało to sens, że wchodzą w interakcję-nic! Jestem po rozum. Czy ktoś widział problem jak ten wcześniej może rzucić trochę światła na to? Dzięki!
Author: Adrian Petrescu, 2010-06-13

12 answers

Kodowanie w XML i XSD (lub DTD) są 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 to powoduje, jest sytuacja, gdy cokolwiek pojawia się przed deklaracją typu dokumentu XML. czyli możesz mieć coś takiego w buforze:

helloworld<?xml version="1.0" encoding="utf-8"?>  

Lub nawet spację lub znak specjalny.

W buforze mogą znajdować się znaki specjalne zwane znacznikami kolejności bajtów. Przed przekazaniem bufora do parsera do to...

String xml = "<?xml ...";
xml = xml.trim().replaceFirst("^([\\W]+)<","<");
 87
Author: Romain Hippeau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-13 03:49:51

Ten Komunikat o błędzie jest zawsze spowodowany nieprawidłową zawartością XML w elemencie początkowym. Na przykład, extra small dot"."na początku elementu XML.

Wszelkie znaki przed "<?xml…." spowodują powyżej " org.xml.sax.SAXParseException: Content is not allowed in prolog " Komunikat o błędzie.

Mała kropka "." przed “<?xml….

Aby to naprawić, po prostu usuń wszystkie te dziwne znaki przed “<?xml“.

Ref: http://www.mkyong.com/java/sax-error-content-is-not-allowed-in-prolog/

 6
Author: Sunmit Girme,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-17 07:12:50

Miałem do czynienia z tym samym problemem. W moim przypadku pliki XML były generowane z programu c# i zasilane do AS400 do dalszego przetwarzania. Po pewnej analizie stwierdziłem, że używam kodowania UTF8 podczas generowania plików XML, podczas gdy javac (w AS400) używa "UTF8 bez BOM". Więc musiałem napisać dodatkowy kod podobny do wspomnianego poniżej:

//create encoding with no BOM
Encoding outputEnc = new UTF8Encoding(false); 
//open file with encoding
TextWriter file = new StreamWriter(filePath, false, outputEnc);           

file.Write(doc.InnerXml);
file.Flush();
file.Close(); // save and close it
 4
Author: Saturn CAU,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-23 13:59:11

W moim pliku xml nagłówek wyglądał tak:

<?xml version="1.0" encoding="utf-16"? />

W pliku testowym, czytałem bajty pliku i dekodowałem dane jako UTF-8 (nie zdając sobie sprawy, że nagłówek w tym Pliku był utf-16), aby utworzyć łańcuch znaków.

byte[] data = Files.readAllBytes(Paths.get(path));
String dataString = new String(data, "UTF-8");

Kiedy próbowałem deserializować ten łańcuch do obiektu, zauważyłem ten sam błąd:

javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.

Kiedy zaktualizowałem drugą linię do

String dataString = new String(data, "UTF-16");
Udało mi się deserializować obiekt. Tak jak Romain zauważył powyżej, kodowanie musi mecz.
 2
Author: dfritch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-09 18:03:01

Miałem do czynienia z tym samym problemem o nazwie "Content is not allowed in prolog" w moim pliku xml.

Rozwiązanie

Początkowo moim głównym folderem 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ć plik lub obiekt URL do metody unmarshaller, użyj strumienia plików.

File myFile = new File("........");
Object obj = unmarshaller.unmarshal(new FileInputStream(myFile));
 2
Author: Ravi Kiran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-25 07:22:01

Usunięcie deklaracji xml rozwiązało to

<?xml version='1.0' encoding='utf-8'?>
 1
Author: F.O.O,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 15:21:36

Zamiast spacji miałem znak tabulacji. Zastąpienie karty '\T' Naprawiono problem.

Wytnij i wklej cały dokument do edytora takiego jak Notepad++ i wyświetl wszystkie znaki.

 0
Author: SoloPilot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-21 13:16:14

W moim przypadku problemu rozwiązaniem było zastąpienie niemieckich umlautów (äöü) ich odpowiednikami HTML...

 0
Author: MBaas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-21 14:31:43

Poniżej znajdują się przyczyny powyżej " org.xml.sax.SAXParseException: treść nie jest dozwolona w prologu " wyjątek.

  1. najpierw sprawdź ścieżkę do pliku schematu.xsd i plik.xml.
  2. kodowanie w XML i XSD (lub DTD) powinno być takie samo.
    Nagłówek pliku XML: <?xml version='1.0' encoding='utf-8'?>
    Nagłówek pliku XSD: <?xml version='1.0' encoding='utf-8'?>
  3. Jeśli coś pojawia się przed deklaracją typu dokumentu XML.i. e: hello<?xml version='1.0' encoding='utf-16'?>
 0
Author: Avinash Dubey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-12 09:36:17

W moim przypadku miałem problem z build.xml plikiem. Rozwiązano to po prostu idąc do Build > Clean Project.

 0
Author: Muz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-17 03:29:09

W duchu "po prostu usuń te wszystkie dziwne znaki przed

    BufferedReader test = new BufferedReader(new InputStreamReader(fisTest));
    test.mark(4);
    while (true) {
        int earlyChar = test.read();
        System.out.println(earlyChar);
        if (earlyChar == 60) {
            test.reset();
            break;
        } else {
            test.mark(4);
        }
    }

FWIW, bajty, które widziałem to (po przecinku): 239, 187, 191.

 0
Author: Tamias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-13 15:07:48

Miałem problem podczas sprawdzania pliku xml w notepad++ i zapisywania pliku, chociaż miałem topowy znacznik XML utf-8 jako <?xml version="1.0" encoding="utf-8"?>

Naprawiono przez zapisanie pliku w notpad++ z kodowaniem (Tab) > kodowanie w UTF-8: wybrane (kodowano w UTF-8-BOM)

 0
Author: techloris_109,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-27 06:24:05