使用URLConnection加载xml内容时的垃圾

时间:2016-08-21 12:18:55

标签: java xml web-crawler

我正在尝试使用XML加载URLConnection页面的内容,但我正在收回垃圾字符。几乎任何其他网站都使用相同的代码,因此我不确定该问题是什么。

以下是相关代码:

String url = "http://myUrl";
URL url = new URL(urlString);
URLConnection conn = url.openConnection();
conn.setConnectTimeout(60*2000); // wait only 60 seconds for a response
conn.setReadTimeout(60*2000);
InputStreamReader isr = new InputStreamReader(conn.getInputStream(), encoding);
BufferedReader in = new BufferedReader(isr);
String inputLine;
while ((inputLine = in.readLine()) != null) {
    wholeDocument += inputLine;     
}       

打印wholeDocument会产生一堆这样的字符:er���;�pI.���$6

我正在使用encoding = 'UTF-8'

我也尝试使用XML库,例如:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new URL(baseUrl).openStream());
System.out.println("doc = " + doc);

但结果是一样的。在终端应用中使用curl时(我在mac上),结果类似,尽管字符如下所示:???0??KZV??????0N6?aH:$?X9v???$&gt; ???“< / p>

知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

如果您检查回复的标题,您会看到 Content-Encoding:gzip 表示响应正文已被压缩,您需要先解压缩,这就是原因你得到那些奇怪的角色。有关Http Compression的更多详情。

使用curl检查标头的好方法是使用详细选项-v,在这种情况下,感谢curl -v http://sites.one.co.il/XML/VOD/ | more,我可以快速查看响应标头。

答案 1 :(得分:1)

扩展另一个答案,你可以检查收到的文件是否是gzip编码,如果是,则解码它:

 if (conn.getHeaderField("Content-Encoding") != null && 
        conn.getHeaderField("Content-Encoding").equals("gzip")){
    InputStream gzStream = new GZIPInputStream(conn.getInputStream());
    InputStreamReader isr = new InputStreamReader(gzStream, encoding);
} else {
    InputStreamReader isr = new InputStreamReader(conn.getInputStream(), encoding);
}

或者,您可以通过以下方式指定您不喜欢gzip编码数据:

conn.setRequestProperty("Accept-Encoding", "identity");