2010-04-26 9 views
5

Mam dziwny problem. I pojawia się następujący błąd, który powoduje wymuszone zamknięcie:Wyjątek parse: W linii 1, kolumna 0: brak elementu

org.apache.harmony.xml.ExpatParser $ ParseException: w wierszu 1, kolumnie 0: brak elementem znaleźć na org.apache.harmony.xml.ExpatParser .parseFragment (ExpatParser.java:508) w org.apache.harmony.xml.ExpatParser.parseDocument (ExpatParser.java:467) w org.apache.harmony.xml.ExpatReader.parse (ExpatReader.java:329) w org.apache.harmony.xml.ExpatReader.parse (ExpatReader.java:286)

Po kliknięciu przycisku Zamknij Siła, działalność jest odtworzony i parsowanie uzupełnia bez żadnych przeszkód. Używam następujący fragment kodu wewnątrz doInBackground o AsyncTask:

URL serverAddress = new URL(url[0]); 

HttpURLConnection connection = (HttpURLConnection) serverAddress.openConnection(); 
connection.setRequestMethod("GET"); 
connection.setDoOutput(true); 
connection.setReadTimeout(10000); 
connection.connect(); 

InputStream stream = connection.getInputStream(); 

SAXParserFactory spf = SAXParserFactory.newInstance(); 
SAXParser sp = spf.newSAXParser(); 

XMLReader xr = sp.getXMLReader(); 

xr.parse(new InputSource(stream)); // The line that throws the exception 

Dlaczego miałby działać siła zamyka aktywny, a następnie bez problemu zaraz po? Czy BufferedInputStream byłby inny? Jestem zdziwiony. :(

Dzięki za każdego czasu

Aktualizacja:.. Okazuje się HttpURLConnection.getResponseCode() zwraca -1 tak często, więc InputStream prawdopodobnie nie jest prawidłowo ustawiony

+0

Wygląda na to, że strumień ma wartość zerową, czy możesz zrzucić jego zawartość do System.out.println z commons IOUtils? – Jon

+0

Czy to jest kopypyp? 'HTTPURLConnection'! =' HttpURLConnection'. – BalusC

+0

To był błąd literowy, naprawiono HttpURLConnection. Przepraszam za to. – jeffh

Odpowiedz

5
HTTPURLConnection connection = (HttpURLConnection) serverAddress.openConnection(); 
connection.setRequestMethod("GET"); 
connection.setDoOutput(true); 

Te linie są nieco dziwne. Czy to jest HTTPURLConnection lub HttpURLConnection? Domyślna metoda żądania to już GET. Model setDoOutput(true) wymusi na nim jednak POST.

Chciałbym wymienić wszystkich tych linii przez

URLConnection connection = serverAddress.openConnection(); 

i ponowić próbę. Może się zdarzyć, że zwrócił błąd, ponieważ wymusiłeś POST i nie zapisałeś niczego na wyjściu (treść żądania). Numer connection.connect() jest już domyślnie wywoływany przez connection.getInputStream(), więc linia jest również zbędna.

Aktualizacja: Czy dla celów testowych działają następujące elementy?

BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8")); 
for (String line; (line = reader.readLine()) != null;) { 
    System.out.println(line); 
} 
reader.close(); 
+0

Dzięki BalusC, niezwykle pouczające. Wprowadzi zmiany i da mu szansę. Co ciekawe, jest to, że większość czasu XML parsuje bez problemu. To prawie los szczęścia, że ​​wyjątek został rzucony ... chociaż wydaje się, że dzieje się tak często, że stanowi problem. – jeffh

+0

Po wprowadzeniu zmian zachowanie wymuszania zamknięcia nadal istnieje. Wygląda na to, że analizator składni niczego nie analizuje. Podłączanie do debuggera, aby dojść do sedna. – jeffh

+0

Jeśli chodzi o aktualizację, to powinno działać, ale myślę, że System.util.Log jest używany zamiast System.out w systemie Android. Przetestuje i zaktualizuje oryginalny wpis. Dzięki! – jeffh

1

Per InputStream javadoc metoda zostanie zablokowana do czasu, gdy dane będą dostępne lub napotkany zostanie EOF, więc druga strona Socket musi ją zamknąć - wtedy zostanie zwrócone wywołanie inStream.read()

Jeśli używasz BufferedReader, możesz Odczytuje się wiersz po linii. Metoda readLine() powróci jako on jako linia odczytywana jest odpowiedź HTTP.

+0

Dziękuję dzierżawcy pierścienia, zajmie się tym dalej. – jeffh

1

W podobnej konstrukcji notatki, załadunku zawartości URL powinien nigdy Wymuszenie zamknięcia działalności - Polecam oddanie to wszystko pod implementacji AsyncTask i zgłosić lub ponownie po powrocie na wątku GUI.

+0

Uzgodnione. Fragment kodu w oryginalnym wpisie znajduje się na stronie DoInBackground zestawu AsyncTask. – jeffh

2

Nie wiem, czy to naprawiłeś, ale miałem ten sam problem. To było dziwne, działało dobrze w emulatorze, ale potem przez telefon zawsze podawał mi błąd xr.parse(). Nawet kiedy wydrukowałem InputStream, dałoby mi to uzasadnione dane wyjściowe dokumentu xml.Wydaje się, że problem polegał na tworzeniu obiektu InputSource Oto jak to naprawiłem: zamiast używać InputStream do stworzenia twojego InputSource właśnie utworzyłem źródło wejściowe bezpośrednio z ciągu URL.

InputSource a = new InputSource(url_string); 

gdzie url_string to tylko ciąg z Twoim adresem URL. Nie pytaj mnie, dlaczego to działa ... Naprawdę nie podoba mi się to, ponieważ nie ma sposobu, aby sprawdzić limity czasu i takie rzeczy, jak się wydaje. Ale działa, daj mi znać, jak to działa!

+0

Dzięki za odpowiedź. Nie sądzę, że będzie działać specjalnie dla mojego przypadku, ponieważ muszę użyć HttpURLConnection.setRequestProperty(). Tymczasowo naprawiłem problem, sprawdzając kod odpowiedzi i ponawiając próbę połączenia, jeśli kod ma wartość -1. Twój wkład może pomóc innym! – jeffh

0

Wpadłem na ten sam problem i nie mogłem go zrozumieć, ponieważ analizowałem bezpośrednio z InputSource. Kiedy zmodyfikowałem kod, aby wyciągnąć wynik do ciągu znaków przed analizą xml, odkryłem, że problem był po prostu błędną nazwą metody usługi sieciowej i że komunikat o błędzie zgłoszony przez tę usługę był zabójcą.

1

Nawet ja stanąłem w obliczu tego samego problemu. Najpierw użyłem InputStream w Scanner, aby wydrukować jego zawartość. A następnie próbuje przekazać go w parserze XML.

Problem polegał na tym, że nie zamykałem obiektu Scanner. I przy użyciu Inputstream w analizatorze składni.

Po zamknięciu obiektu skanera udało mi się rozwiązać ten problem.