2010-04-08 23 views
47

Piszę program w Javie, który pobiera niestandardowy plik XML i analizuje go. Używam pliku XML do przechowywania. Otrzymuję następujący błąd w Eclipse.Parsowanie XML dokumentu XML daje "Treści niedozwolone w prologu". error

[Fatal Error] :1:1: Content is not allowed in prolog. 
org.xml.sax.SAXParseException: Content is not allowed in prolog. 
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:239) 
    at  com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:283 ) 
    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:208) 
    at me.ericso.psusoc.RequirementSatisfier.parseXML(RequirementSatisfier.java:61) 
    at me.ericso.psusoc.RequirementSatisfier.getCourses(RequirementSatisfier.java:35) 
    at  me.ericso.psusoc.programs.RequirementSatisfierProgram.main(RequirementSatisfierProgram.java:23 ) 

Początek pliku XML jest wliczone:

<?xml version="1.0" ?> 
<PSU> 
    <Major id="IST"> 
     <name>Information Science and Technology</name> 
     <degree>B.S.</degree> 
     <option> Information Systems: Design and Development Option</option> 
     <requirements> 
      <firstlevel type="General_Education" credits="45"> 
       <component type="Writing_Speaking">GWS</component> 
       <component type="Quantification">GQ</component> 

Program jest w stanie czytać w pliku XML, ale gdy zgłoszę DocumentBuilder.parse(XMLFile) uzyskać analizowany org.w3c.dom.Document, pojawia się błąd powyżej.

Nie wydaje mi się, że mam nieprawidłową zawartość w prologu mojego pliku XML. Nie wiem, co jest nie tak. Proszę pomóż. Dzięki.

+2

Znalazłem błąd. Czytałem w folderze, w którym znajdował się plik, a nie w samym pliku.Wygląda na to, że jeśli czytasz w folderze jako plik i wywołujesz plik File.exists(), to nadal będzie on zwracał wartość true. Głupi ... Dzięki za pomoc. – ericso

+0

sprawdź moją odpowiedź na http://stackoverflow.com/questions/3665554/about-saxparseexception-content-is-not-allowed-in-prolog/7023984 lub po prostu sprawdź ten link http://mark.koli.ch/2009 /02/resolving-orgxmlsaxsaxparseexception-content-is-not-allowed-in-prolog.html – Starfish

+0

nie wiem, czy to pomoże każdemu, ale mam ten błąd, próbując użyć flavorDimensions i umieszczając drawable-xhdpi w res w moich smakach. Raz zmieniłem go na drawable .. wszystko naprawiono – dangalg

Odpowiedz

3

Dokument wygląda dobrze, ale podejrzewam, że zawiera niewidoczne znaki. Otwórz go w edytorze szesnastkowym, aby sprawdzić, czy naprawdę nie ma niczego przed pierwszym "<". Upewnij się, że spacje w nagłówku XML są spacjami. Może usunąć spację przed "?>". Sprawdź, które linie podziału są używane.

Upewnij się, że dokument jest poprawny UTF-8. Niektóre edytory okien zapisują dokument jako UTF-16 (tj. Co drugi bajt to 0).

+0

Edytowałem plik XML w edytorze tekstu Eclipse. Jestem na komputerze Mac i również używam BBEdit. Sprawdzę niewidzialne postacie. – ericso

+0

Sprawdziłem niewidoczne znaki w BBEdit (Widok> Wyświetlanie tekstu> Pokaż niewidoczne) i nie widzę żadnych niewidocznych znaków w deklaracji XML. Usunąłem również białe spacje na końcu deklaracji. Dodałem kodowanie = "UTF-8" i kodowanie = "UTF-16 i nadal dostaję błąd – ericso

+0

Co to jest kodowanie pliku? Czyli nie to, co myślisz, ale co mówi twój redaktor? –

7

Upewnij się, że na początku pliku XML nie ma żadnych ukrytych spacji. Może również zawierać kodowanie = "UTF-8" (lub 16? Brak wskazówki) w węźle.

+1

Jest to niestety najprawdopodobniej przyczyną. – Esko

+0

Sprawdzono w BBEdit dla ukrytych znaków i dodano atrybut kodowania do deklaracji XML. Oboje go nie naprawili. – ericso

0

Jeśli jesteś w stanie kontrolować plik xml, spróbuj dodać trochę więcej informacji na początku pliku:

<?xml version="1.0" encoding="UTF-16" standalone="no"?> 
+0

Dodałem oba standalone = "no" i standalone = "yes". Oba dają mi ten sam błąd. – ericso

+2

hmmm ... Następną rzeczą, którą chciałbym wypróbować, jest brutalna siła - spróbuj uzyskać fikcyjny dokument przez parser, a następnie powoli dodawaj części oryginalnego dokumentu, dopóki nie zidentyfikujesz problemu. Byłem na tej drodze wcześniej :-) –

0

Sprawdź jakikolwiek problem składni w pliku XML. Znalazłem ten błąd podczas pracy nad xsl/xsp z Cocoon i definiowałem zmienną za pomocą nieistniejącego węzła lub czegoś podobnego. Sprawdź cały kod XML.

+0

Otrzymuję błąd, zanim będę mógł zrobić cokolwiek z parsowanym dokumentem. Zawodzi, gdy zadzwonię do DocumentBuilder.parse (XMLFile). Uruchomiłem plik XML za pomocą walidatora XML (xmlvalidation.com) i wszystko poszło dobrze. – ericso

+0

Czy plik jest dostępny w podanej lokalizacji? Może twój program nie może uzyskać dostępu do zawartości pliku, a analizator składni po prostu stwierdza, że ​​nie jest prawidłowy xml ... tylko zgadywanie. – Alfabravo

+0

@Alfabravo nieco inne pytanie, czy wiesz, jeśli mam błąd parsowania, w jaki sposób można złapać ten wyjątek. Konstruktor dokumentów w java, nie wyrzuca wyjątku raczej drukuje w strumieniu błędów, więc jak mogę powiadomić użytkownika, jeśli uszkodzony plik został dostarczony? –

19

Proszę sprawdzić plik xml, czy ma on taki znak śmieciowy . Jeśli istnieje, użyj poniższej składni, aby go usunąć.

String XString = writer.toString(); 
XString = XString.replaceAll("[^\\x20-\\x7e]", ""); 
+2

Znalazłem tę naprawdę prostą technikę, która może być przydatna jako szybka naprawa. W celu zachowania nowych linii możesz jednak preferować wyrażenie "replaceAll" ("[^ \\ x20 - \\ x7e \\ x0A]", ""); " – Patrick

1

Zakładam, że masz odpowiednie kodowanie XML i dopasowanie do schematu.

Jeśli nadal pojawia się ten błąd, sprawdź kod, który usuwa format XML i typ użytego wejścia. Ponieważ dokumenty XML deklarują własne kodowanie, lepiej jest utworzyć obiekt StreamSource z InputStream zamiast z Reader, aby procesor XML mógł poprawnie obsłużyć zadeklarowane kodowanie [Ref Book: Java w skrócie]

Mam nadzieję, że pomaga!

8

Myślę, że jest to również rozwiązanie tego problemu.

Zmień typ dokumentu z 'Kodowanie UTF-8' Aby 'Kodowanie UTF-8 bez BOM'

mam rozwiązać mój problem, wykonując te same zmiany.

1

Nie podajesz prawidłowego adresu dla pliku. Musisz podać adres, na przykład C:/Users/xyz/Desktop/myfile.xml

+0

OP wykryło to i wskazało w komentarzu do pytanie – kolossus