2012-05-04 3 views
0

я использую JDOM с моим Android проекта, и каждый раз, когда я получаю определенный набор символов в моем ответе сервера, я в конечном итоге с этими сообщениями об ошибках:JDOM Бросив Parse Исключения с плохими персонажами ASCii

05- 04 10: 08: 46.277: E/PARSE: org.jdom.input.JDOMParseException: ошибка в строке 95 документа UTF-8: по строке 95, столбец 5263: незамкнутый токен

05-04 10: 08: 46.277 : E/Обработчик ошибок: обработчик не выполнен: org.jdom.input.JDOMParseException: ошибка в строке 1: по строке 1, столбец 0: ошибка синтаксиса

Когда я делаю тот же запрос через google chrome, я вижу, что al l XML прошел через штраф, и что на самом деле нет областей, где токен не закрыт. Я столкнулся с этой проблемой несколько раз на протяжении всей разработки приложения, и решение всегда заключалось в удалении нечетных символов ascii (логотипы авторских прав или знаки товарных знаков и т. Д., Которые были скопированы/вставлены в эти поля данных). Как я могу получить его для удаления этих символов, или b разделить их и продолжить функцию. Вот пример одной из моих функций синтаксического анализа.

public static boolean parseUserData(BufferedReader br) { 
    SAXBuilder builder = new SAXBuilder(); 
    Document document = null; 

    try { 
     document = builder.build(br); 

     /* XML Output to Logcat */ 
     if (document != null) { 
      XMLOutputter outputter = new XMLOutputter(
        Format.getPrettyFormat()); 
      String xmlString = outputter.outputString(document); 
      Log.e("XML", xmlString); 
     } 

     Element rootNode = document.getRootElement(); 
     if (!rootNode.getChildren().isEmpty()) { 

      // Do stuff 
      return true; 
     } 

    } catch (Exception e) { 
     GlobalsUtil.errorUtil 
       .setErrorMessage("Error Parsing XML: User Data"); 
     Log.e(DEBUG_TAG, e.toString()); 
     return false; 
    } 
} 
+0

Вы можете загрузить пример ответ где-то так мы можем это увидеть? Также вы говорите, что определенный набор символов вызывает проблему, но какие? Где они используются? – Jules

+0

Я не могу загрузить ответ, так как приведенный выше код является скорректированной версией (переменные и имена методов изменены) нашего фактического кода. Я не могу загрузить ответ XML с ошибкой, поскольку он содержит конфиденциальную информацию о клиенте. Ошибки появляются, когда наши клиенты копируют/вставляют вещи в такие поля, как (у нас есть их копирование/вставка из их электронных писем, и такие вещи, как «Powered by Motorola (tm) <--- ascii (tm)», будут отображаться и вызывать – RyanInBinary

ответ

1

Это отчетливо звучит как проблема кодирования символов. Я думаю, что даффимо верно в его оценке. У меня есть два комментария, хотя ....

Если вы получаете свои данные через URL-адрес, вы должны использовать URLConnection.getContentType(), чтобы получить кодировку (если она установлена ​​и кодировка не равна нулю), чтобы установить вверх InputStreamReader на InputStream URL ...

Вы пробовали JDOM 2.0.1? Это первая версия JDOM, полностью протестированная на Android ... (и единственная поддерживаемая версия JDOM на Android). JDOM 2.0.1 также имеет ряд улучшений производительности и оптимизации памяти, которые должны ускорить вашу обработку. Он также исправляет ряд ошибок .... хотя от того, что я вижу, что вы не должны работать в какой-либо проблемы, ошибки .....

ЗАКАНЧИВАТЬ https://github.com/hunterhacker/jdom/wiki/JDOM2-Migration-Issues и https://github.com/hunterhacker/jdom/wiki/JDOM2-and-Android

+0

Я обновил до jdom 2, который еще ничего не исправить, но может помешать мне иметь ошибки в будущем, поэтому я ценю эту информацию. Однако я не уверен в типе содержимого URL. Я использую HttpResponse, а затем getEntity(). GetContent() передается в мой считыватель потока ввода. Это плохой способ справиться с этим? – RyanInBinary

+0

http://developer.android.com/reference/org/apache/http/HttpEntity.html#getContentType%28%29 <--- вы должны ожидать какое-то значение ... на самом деле, просто посмотрите на этот ответ здесь : http://stackoverflow.com/questions/1381617/simplest-way-to-correctly-load-html-from-web-page-into-a-string-in-java – rolfl

1

Является ли BufferedReader построенным для принятия аргумента кодирования? Возможно, вам нужно сообщить читателю или InputStream, что вы используете UTF-8.

+0

Это похоже на то, что это может быть частью проблемы, как я могу установить ее в созданном BufferedReader – RyanInBinary

+0

Я не вижу такого аргумента в javadocs. Он должен быть установлен в объекте, который вы обертываете BufferedReader. – duffymo

+0

В моем коде запроса (который захватывает/возвращает BufferedReader, которое потом прошло, я установил режим ISO, но не UTF). BufferedReader ш = новый BufferedReader (новый InputStreamReader ( \t \t \t \t \t response.getEntity() .getContent(), "ISO-8859-1")); – RyanInBinary

Смежные вопросы