无聊想写个读取RSS的东东,思路比较清晰:
⒈用ajax根据url抓取xml数据;
⒉解析数据,提取有用的信息;
⒊将提取出来的数据以合理的方式显示。
本来以为比较简单的,谁知道在第一步就卡住了。首先,ajax存在跨域问题,直接抓取没有权限。那只好后台用URL去取。
可是抓回来的xml文件,只要有中文就是乱码。用new(string.getByte(),"UTF-8")解码,会出现中文部分乱码。抓取代码如下:
简单总结问题原因:读取xml文件流的时候要使用相符合的编码方式。一般xml都是用UTF-8编码,而系统的默认读取应该是GBK
(简体中文)。上一点只是猜想:因为我用new(string.getByte(),"UTF-8"),用的是默认GBK读取,可以解出部分中文。
所以因该在读取xml时候指定编码,下面代码注释1。
解出的代码,如果直接传回ajax处理,会得步到xml对象。细看下最后输出得xml文件,发现最后多了一个"?"。这个问号因该是
用来表明xml结束的。但是dom对xml格式要求和严格,所以直接给回肯定是的不到responseXML.documentElement对象的。去掉后
可以正常解析。
1public class GetRss extends HttpServlet
2{
3 private static final Logger logger = Logger.getLogger(GetRss.class);
4
5 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
6 {
7 String url = request.getParameter("RssUrl");
8 logger.info(url);
9 try
10 {
11 URL RssUrl = new URL(url);
12 InputStream stream = RssUrl.openStream();
13 BufferedReader in = new BufferedReader(new InputStreamReader(stream),"UTF-8");//1
14 boolean loop = true;
15 StringBuffer sb = new StringBuffer();
16
17
18 while (loop) {
19 if ( in.ready() ) {
20 int i=0;
21 while (i!= -1) {
22 i = in.read();
23 sb.append((char)i);
24 }
25 loop = false;
26 }
27 }
28 int len = sb.length();
29 String out = sb.substring(0, len-1);//2
30 response.setContentType("text/xml;charset=utf-8");
31 response.setHeader("Cache-Control", "no-cache");
32
33 PrintWriter pw=new PrintWriter(new OutputStreamWriter(response.getOutputStream(),"UTF-8"));
34 pw.write(out);
35 pw.close();
36 }
37 catch (MalformedURLException e)
38 {
39
40 logger.error("GetRss.execute Error. " + e.getMessage());
41 }
42 catch (IOException e)
43 {
44 logger.error("GetRss.execute Error. " + e.getMessage());
45 }
46 }
47
48}