我正在尝试从googles weather api获取天气数据,并通过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:文档http://www.google.de/ig/api?weather=Heidelberg&hl=en第1行出错:
致命错误:com.sap.engine.lib.xml.parser.ParserException:
在字符(十六进制)0x72,(bin)1110010处检测到错误的编码序列 检查解析的输入是否包含正确编码的字符 使用的编码是:'utf-8'(http://www.google.de/ig/api?weather=Heidelberg&hl=en,row:1,col:191):
在字符(十六进制)0x72,(bin)1110010处检测到错误的编码序列 检查解析的输入是否包含正确编码的字符 使用的编码是:'utf-8'(http://www.google.de/ig/api?weather=Heidelberg&hl=en,row:1,col:191)
当我在浏览器中打开URL时,检查编码为UTF-8的页面属性。所以我不知道它为什么不起作用。 有人有想法吗?
祝你好运, 保罗
答案 0 :(得分:1)
该URL的xml结果在其xml标头中不包含任何编码。而是在http响应的Content-Type标头(ISO-8859-1)上指定编码。显然,即使您将URL传递给jdom,它也没有正确处理(它使用UTF-8,这是没有编码的xml的默认值)。您需要自己处理http响应(读取标头并将正确的编码传递给jdom),或使用可以为您执行此操作的解析器(尽管我不知道任何标准的xml解析器)。
如果您使用标准xml API,则可以执行以下操作:
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);