无聊想写个读取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对象的。去掉后
可以正常解析。
1
public 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
}