2010-06-14 12 views
5

Jesteśmy parsowania dokumentu XML przy użyciu JAXB i uzyskać ten błąd:Wyjaśnienie błędu JAXB: nieprawidłowy bajt 1 z 1-bajtowy UTF-8 sekwencji

[org.xml.sax.SAXParseException: Invalid byte 1 of 1-byte UTF-8 sequence.] 
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:315) 

Co to dokładnie znaczy i jak możemy rozwiązać to??

Jesteśmy wykonywanie kodu jako:

jaxbContext = JAXBContext.newInstance(Results.class); 
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
unmarshaller.setSchema(getSchema()); 
results = (Results) unmarshaller.unmarshal(new FileInputStream(inputFile)); 

Aktualizacji

Problem pojawia się z powodu tego znaku "śmieszne" w pliku XML: ¿

Dlaczego Czy spowodowałoby to taki problem?

Aktualizacja 2

Istnieją dwa z tych dziwnych znaków w pliku. Są w środku pliku. Zauważ, że plik jest tworzony na podstawie danych w bazie danych i te dziwne znaki jakoś dostały się do bazy danych.

Update 3

Oto pełna XML fragment:

<Description><![CDATA[Mt. Belvieu ¿ Texas]]></Description> 

Update 4

Zauważ, że nie ma <?xml ...?> nagłówka.

HEX do szczególnego charakteru jest BF

+1

Oznacza to, że dane wejściowe są uszkodzone .... niewiele mogę powiedzieć bez dodatkowych informacji. – skaffman

+0

Dodano więcej informacji. Czy to ma jakiś sens? Dzięki za pomoc! –

+1

Czy możesz opublikować sekcję pliku XML, który zawiera obraźliwy tekst. – ChrisF

Odpowiedz

3

Więc problemem jest to, że JAXB traktuje plików XML bez <?xml ...?> nagłówku jako UTF-8, gdy plik używa innego kodowania (prawdopodobnie ISO-8859-1 lub Windows-1252, jeśli 0xBF charakter rzeczywiście ma oznaczać ¿) .

Jeśli możesz zmienić producenta pliku, możesz dodać nagłówek <?xml ...?> z faktyczną specyfikacją kodowania lub po prostu użyć UTF-8 do napisania pliku.

Jeśli nie można zmienić producenta, trzeba użyć InputStreamReader z wyraźnej specyfikacji kodowania, ponieważ (niestety) JAXB nie pozwalają, aby zmienić jego domyślne kodowanie:

results = (Results) unmarshaller.unmarshal(
    new InputStreamReader(new FileInputStream(inputFile), "ISO-8859-1")); 

Jednak to rozwiązanie jest kruche - kończy się niepowodzeniem w plikach wejściowych z nagłówkiem <?xml ...?> z inną specyfikacją kodowania.

+0

Dzięki, spróbuję. Zauważ, że pojawia się ten sam błąd, gdy używam Xalan/Java, aby spróbować sformatować plik XML za pomocą XSLT. Czy Xalan zakłada także UTF-8? –

+0

To działa! Zauważ, że ten kod działa tylko na tym pliku, który nigdy nie będzie miał nagłówka xml. Jaka jest różnica/różnica w porównaniu z tym podejściem w porównaniu z użyciem: 'results = (Wyniki) unmarshaller.unmarshal (nowy FileReader (inputFile));' –

+1

@Marcus: 'FileReader' używa domyślnego kodowania systemu, gdy' InputStreamReader 'używa wyraźnie określonego. – axtavt

1

To prawdopodobnie Byte Order Mark (BOM) i jest specjalną sekwencją bajt na początku pliku UTF. Są one, szczerze mówiąc, bólem w dupę i wydają się szczególnie powszechne podczas interakcji z systemami .net.

Spróbuj inaczej sformułować swój kod, aby użyć Reader raczej niż InputStream:

results = (Results) unmarshaller.unmarshal(new FileReader(inputFile)); 

Reader jest UTF-świadomy i może dokonać lepszego ukłucie na niego. Prościej zdać File bezpośrednio do Unmarshaller i pozwól JAXBContext martwić:

results = (Results) unmarshaller.unmarshal(inputFile); 
+0

Mogę spróbować. Zauważ, że w pliku znajdują się dwa z tych znaków - zobacz drugą aktualizację postu. –

+0

Korzystanie z 'FileReader' wygląda dobrze. Wystąpił ten sam błąd, gdy właśnie podałem 'Plik'. Sprawdzę wszystkie wyniki, ale to wygląda dobrze! –

+0

Ale rozumiem, że te po prostu wydają się być "dziwnymi" postaciami, a nie "Znakiem porządkowym bajtów", nie? Dlaczego powodują ten problem? –

0

To brzmi tak, jakby Twój XML jest zakodowany w UTF-16, ale że kodowanie nie jest uzyskiwanie przekazany do Unmarshaller. Z Marshallerem możesz ustawić to przy użyciu marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-16");, ale ponieważ Unmarshaller nie jest wymagany do obsługi jakichkolwiek właściwości, nie jestem pewien, jak wymusić to inne niż upewnienie się, że twój dokument XML ma encoding="UTF-16" w początkowym elemencie <?xml?>.

+1

Nie może to być UTF-16 - spróbuj przeprowadzić analizę pliku XML zakodowanego w UTF-16, ponieważ kodowanie UTF-8 zakończy się niepowodzeniem z powodu nieprawidłowego znacznika. Prawdopodobnie jest to kodowanie jednobajtowe. – axtavt

+0

Masz rację. Patrzyłem na różne kodowania i się pomieszałem. – Andy

Powiązane problemy