JDOM Parse XML с Umlauts - PullRequest
       8

JDOM Parse XML с Umlauts

0 голосов
/ 27 декабря 2011

Я пытаюсь получить данные о погоде из API googles weather и анализировать документ с помощью JDOM.

Это код, который я использую:

SAXBuilder builder = new SAXBuilder();
Document doc;
URL url = new URL(GOOGLE_WEATHER_API);
doc = builder.build(url);       
Element root = doc.getRootElement();
Element weather = root.getChild("weather");
List currentConditions = weather.getChildren("current_conditions");
...

Проблема в том, чтовсякий раз, когда возвращаемый Google XML содержит Umlaut (ü, ä, ö ...), я получаю JDOMParseException

org.jdom.input.JDOMParseException: ошибка в строке 1 документа http://www.google.de/ig/api?weather=Heidelberg&hl=en:
Неустранимая ошибка: com.sap.engine.lib.xml.parser.ParserException:
Обнаружена неверная кодированная последовательность символов (hex) 0x72, (bin) 1110010.
Проверьте, содержит ли проанализированный вход правильно закодированныйсимволов.
Используется кодировка: 'utf-8' (http://www.google.de/ig/api?weather=Heidelberg&hl=en, строка: 1, столбец: 191):
Обнаружена неверная кодированная последовательность символов (шестнадцатеричное значение) 0x72, (ячейка) 1110010.
Проверкасодержит ли проанализированный ввод правильно закодированные символы.
Используется кодировка: 'utf-8' (http://www.google.de/ig/api?weather=Heidelberg&hl=en, строка: 1, столбец: 191)

Когда я открываю URL в браузерепроверьте свойства страницы в кодировке UTF-8.Поэтому я не знаю, почему это не работает.У кого-нибудь есть идея?

С наилучшими пожеланиями, Пол

1 Ответ

1 голос
/ 27 декабря 2011

Результат XML от этого URL не содержит никакой кодировки в своем заголовке xml.Вместо этого кодировка указана в заголовке Content-Type ответа http (ISO-8859-1).Очевидно, что даже если вы передаете URL-адрес в jdom, он не обрабатывает это правильно (он использует UTF-8, который используется по умолчанию для xml без кодировки).Вам нужно либо обработать ответ http самостоятельно (прочитать заголовок и передать правильную кодировку в jdom), либо использовать парсер, который может сделать это за вас (хотя я не знаю ни одного стандартного парсера xml, который это сделает).

Если бы вы использовали стандартные API xml, вы бы сделали что-то вроде:

HttpURLConnection = (HttpURLConnection)url.openConnection();
String encoding = ... // get encoding from http header
InputSource source = new InputSpource(url.openStream());
source.setEncoding(encoding);
DocumentBuilder db = ... // create doc builder
Document doc = db.parse(source);
...