用Java编写的Sax解析器

时间:2012-03-26 21:29:43

标签: java android encoding rss xml-parsing

我遇到了sax解析器和编码文本的问题。我尝试用ISO-8859-2(http://www.sbazar.cz/rss.xml?keyword=pes)解析RSS:

InputStream responseStream = connection.getInputStream();
Response response = mRequest.createResponse();

Reader reader = new InputStreamReader(responseStream);
InputSource is = new InputSource(reader);
is.setEncoding("ISO-8859-2");

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
saxParser.parse(is, response);

但解析器返回带有奇怪符号的字符串。我尝试了很多东西,但没有任何帮助我:(有人能帮帮我吗?

enter image description here

3 个答案:

答案 0 :(得分:2)

您是否尝试过设置InputStreamReader的字符集:

Reader reader = new InputStreamReader(responseStream, Charset.forName("ISO-8859-2"));
InputSource is = new InputSource(reader);

如果你没有指定字符集,则InputStreamReader(InputStream)构造函数使用默认字符集(在我的机器中是windows-1252)。

因此,在您当前的设置中,字节被解释为(可能)windows-1252个字符,之后我认为您不能将它们重新解释为ISO-8859-2。

答案 1 :(得分:1)

如果给定输入流而不是读者,Sax能够自动检测编码。

InputSource is = new InputSource(responseStream)

可能在你的情况下你想要一个硬编码编码,你得到了如何做到这一点的答案。但我正在寻找一个通用的解决方案,在这里找到一个:Howto let the SAX parser determine the encoding from the xml declaration?

文档:InputSource in java 5(请注意,java 1.4文档缺少关键句子)。 使用诸如XML规范中的算法之类的算法自动检测字符编码。这指的是字节流,但不是字符流( Reader

当我在XML文档(Autodetection of Character Encodings)中挖掘更多内容时,我找到了处理 Reader Stream 之间区别的解释。要应用所有编码算法,Sax必须能够访问原始流,而不是转换为字符,因为转换可能会损坏字节标记。

答案 2 :(得分:0)

最后,我使用Rome library解决了我的问题。它也适用于ISO-8859-2。以下是源代码,如何使用罗马:

String urlstring = "http://www.sbazar.cz/rss.xml?keyword=pes";
InputStream is = new URL(urlstring).openConnection().getInputStream();
SyndFeedInput input = new SyndFeedInput();
SyndFeed feed = (SyndFeed)input.build(new InputStreamReader(is, Charset.forName("ISO-8859-2")));

Iterator entries = feed.getEntries().iterator();
while (entries.hasNext())
{
    SyndEntry entry = (SyndEntry)entries.next();
    Log.d("RSS", "-------------");
    Log.d("RSS", "Title: " + entry.getTitle());
    Log.d("RSS", "Published: " + entry.getPublishedDate());

    if (entry.getDescription() != null) 
    {
        Log.d("RSS", "Description: " + entry.getDescription().getValue());
    }
    if (entry.getContents().size() > 0) 
    {
        SyndContent content = (SyndContent)entry.getContents().get(0);
        Log.d("RSS", "Content type=" + content.getType());
        Log.d("RSS", "Content value=" + content.getValue());
    }
}