Исключение при разборе: в строке 1, столбце 0: элемент не найден - PullRequest
5 голосов
/ 26 апреля 2010

У меня странная проблема. Я получаю следующую ошибку, которая вызывает принудительное закрытие:

org.apache.harmony.xml.ExpatParser $ ParseException: в строке 1, столбец 0: элемент не найден в org.apache.harmony.xml.ExpatParser.parseFragment (ExpatParser.java:508) в org.apache.harmony.xml.ExpatParser.parseDocument (ExpatParser.java:467) в org.apache.harmony.xml.ExpatReader.parse (ExpatReader.java:329) в org.apache.harmony.xml.ExpatReader.parse (ExpatReader.java:286)

После нажатия кнопки «Принудительно закрыть» действие воссоздается, и анализ выполняется без заминки. Я использую следующий фрагмент кода внутри doInBackground 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

Почему Activity принудительно закрывается, а затем сразу же запускается без проблем? Будет ли BufferedInputStream отличаться? Я сбит с толку. (

Спасибо, что уделили время всем.

Обновление: получается, что HttpURLConnection.getResponseCode () время от времени возвращает -1, так что InputStream, вероятно, устанавливается неправильно.

Ответы [ 6 ]

6 голосов
/ 26 апреля 2010
HTTPURLConnection connection = (HttpURLConnection) serverAddress.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);

Эти строки немного странные. Это HTTPURLConnection или HttpURLConnection? Метод запроса по умолчанию уже GET. Однако setDoOutput(true) заставит его POST.

Я бы заменил все эти строки на

URLConnection connection = serverAddress.openConnection();

и повторите попытку. Может случиться так, что он вернул ошибку, потому что вы принудительно POST и ничего не записали в вывод (тело запроса). connection.connect(), кстати, уже неявно называется connection.getInputStream(), так что эта строка также лишняя.

Обновление : работает ли следующее для целей тестирования?

BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
for (String line; (line = reader.readLine()) != null;) {
    System.out.println(line);
}
reader.close();
2 голосов
/ 27 апреля 2010

Не знаю, исправили ли вы это, но у меня была такая же проблема. Это было странно, в эмуляторе все работало бы нормально, но на телефоне всегда выдавала ошибку xr.parse(). Даже когда я напечатал InputStream, это дало бы мне законный вывод документа xml. Казалось, проблема была в создании InputSource объекта

Вот как я это исправил: вместо использования InputStream для создания InputSource я только что создал источник ввода непосредственно из строки URL.

InputSource a =  new InputSource(url_string);   

где url_string - просто строка с вашим URL. Не спрашивайте меня, почему это работает ... Мне это не очень нравится, так как нет способа проверить тайм-ауты и тому подобное. Но это работает, дайте мне знать, как это происходит!

1 голос
/ 08 декабря 2016

Даже я столкнулся с той же проблемой. Сначала я использовал InputStream в Scanner, чтобы напечатать его содержимое. А затем пытается передать его в XML-парсер.

Проблема заключалась в том, что я не закрывал объект Scanner. И используя Inputstream в парсере.

После закрытия объекта сканера я смог решить эту проблему.

1 голос
/ 27 апреля 2010

В соответствующей заметке о дизайне загрузка содержимого URL-адреса никогда не должна принудительно закрывать действие - я рекомендую поместить все это в реализацию AsyncTask и сообщить или повторить попытку после того, как вы вернетесь в поток графического интерфейса.

1 голос
/ 26 апреля 2010

В InputStream javadoc метод будет блокироваться до тех пор, пока не будут доступны данные или не будет обнаружен EOF. Таким образом, другая сторона Socket должна закрыть его - тогда вызов inStream.read () вернется.

Если вы используете BufferedReader, вы можете читать построчно. Метод readLine() вернется, как только будет прочитана строка из ответа HTTP.

0 голосов
/ 17 сентября 2010

Я столкнулся с той же проблемой и не мог понять ее, поскольку выполнял синтаксический анализ непосредственно из InputSource. Когда я изменил код, чтобы получить результат в строку перед синтаксическим анализом xml, я обнаружил, что проблема заключалась в том, что имя метода веб-службы было введено с ошибкой, а сообщение об ошибке, сообщенное этой службой, было убийцей.

...