没有为ANDROID RSS阅读器解析CDATA



我正在开发一个读取RSS提要的ANDROID应用程序,所以我使用了本教程(http://android-er.blogspot.com/2010/05/simple-rss-reader-ii-implement-with.html)/源代码,并将其实现到我自己的url rss提要中。但是描述标签没有显示。。在feeder的xml中,描述标签大多是CDATA。如何解析rss中的描述cdata??谢谢

这是我的处理程序代码:

import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
public class RSSHandler extends DefaultHandler {
final int state_unknown = 0;
final int state_title = 1;
final int state_description = 2;
final int state_link = 3;
final int state_pubdate = 4;
int currentState = state_unknown;
RSSFeed feed;
RSSItem item;
boolean itemFound = false;
RSSHandler(){
}
RSSFeed getFeed(){
    return feed;
}
@Override
public void startDocument() throws SAXException {
    // TODO Auto-generated method stub
    feed = new RSSFeed();
    item = new RSSItem();
}
@Override
public void endDocument() throws SAXException {
    // TODO Auto-generated method stub
}
@Override
public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {
    // TODO Auto-generated method stub
    if (localName.equalsIgnoreCase("item")){
        itemFound = true;
        item = new RSSItem();
        currentState = state_unknown;
    }
    else if (localName.equalsIgnoreCase("title")){
        currentState = state_title;
    }
    else if (localName.equalsIgnoreCase("description")){
        currentState = state_description;
    }
    else if (localName.equalsIgnoreCase("link")){
        currentState = state_link;
    }
    else if (localName.equalsIgnoreCase("pubdate")){
        currentState = state_pubdate;
    }
    else{
        currentState = state_unknown;
    }
}
@Override
public void endElement(String uri, String localName, String qName)
        throws SAXException {
    // TODO Auto-generated method stub
    if (localName.equalsIgnoreCase("item")){
        feed.addItem(item);
    }
}
@Override
public void characters(char[] ch, int start, int length)
        throws SAXException {
    // TODO Auto-generated method stub
    String strCharacters = new String(ch,start,length);
    if (itemFound==true){
    // "item" tag found, it's item's parameter
        switch(currentState){
        case state_title:
            item.setTitle(strCharacters);
            break;
        case state_description:
            item.setDescription(strCharacters);
            break;
        case state_link:
            item.setLink(strCharacters);
            break;
        case state_pubdate:
            item.setPubdate(strCharacters);
            break;  
        default:
            break;
        }
    }
    else{
    // not "item" tag found, it's feed's parameter
        switch(currentState){
        case state_title:
            feed.setTitle(strCharacters);
            break;
        case state_description:
            feed.setDescription(strCharacters);
            break;
        case state_link:
            feed.setLink(strCharacters);
            break;
        case state_pubdate:
            feed.setPubdate(strCharacters);
            break;  
        default:
            break;
        }
    }
    currentState = state_unknown;
}

  }

RSSFeed:

 import java.util.List;
 import java.util.Vector;
 public class RSSFeed {
   private String title = null;
   private String description = null;
   private String link = null;
   private String pubdate = null;
   private List<RSSItem> itemList;
RSSFeed(){
    itemList = new Vector<RSSItem>(0);
}
void addItem(RSSItem item){
    itemList.add(item);
}
RSSItem getItem(int location){
    return itemList.get(location);
}
List<RSSItem> getList(){
    return itemList;
}
void setTitle(String value)
{
    title = value;
}
void setDescription(String value)
{
    description = value;
}
void setLink(String value)
{
    link = value;
}
void setPubdate(String value)
{
    pubdate = value;
}
String getTitle()
{
    return title;
}
String getDescription()
{
    return description;
}
String getLink()
{
    return link;
}
String getPubdate()
{
    return pubdate;
}
   }

我就是这么做的:

public class RssHandler extends DefaultHandler {
private RssItem item;
private RssFeed feed;
private boolean inItem;
private String value;
private StringBuffer buffer;
@Override
public void startElement(
        String nameSpaceURI,
        String localName,
        String qName,
        Attributes atts
) {
    buffer = new StringBuffer();
    if (localName.equals("channel")) {
        feed = new RssFeed();
        inItem = false;
    } else if (localName.equals("item")) {
        item = new RssItem();
        inItem = true;
    }
}
public void endElement(
        String uri,
        String localName,
        String qName) {
    value = buffer.toString();
    buffer.setLength(0);
    value = Html.fromHtml(value).toString();
    if (localName.equals("pubDate") && !inItem) {
        feed.setPublishedDate(value);
    } else if (localName.equals("title") && !inItem) {
        feed.setTitle(value);
    } else if (localName.equals("link") && !inItem) {
        URL url = null;
        try {
            url = new URL(value);
        } catch (MalformedURLException e) {
            Log.e("ERR", "error while creating url from [" + value + "]");
        }
        if (url != null) {
            feed.setLink(url);
        }
    } else if (localName.equals("description") && !inItem) {
        feed.setDescription(value);
    } else if (localName.equals("pubDate") && inItem) {
        item.setPublishedDate(value);
    } else if (localName.equals("title") && inItem) {
        item.setTitle(value);
    } else if (localName.equals("link") && inItem) {
        URL url = null;
        try {
            url = new URL(value);
        } catch (MalformedURLException e) {
            Log.e("ERR", "error while creating url from [" + value + "]");
        }
        if (url != null) {
            item.setLink(url);
        }
    } else if (localName.equals("description") && inItem) {
        item.setDescription(value);
    } else if (localName.equals("item")) {
        feed.addItem(item);
        inItem = false;
    }
}
public void characters(char[] ch, int start, int end) {
    buffer.append(new String(ch, start, end));
}
public ArrayList<RssItem> getRss() {
    return this.rss;
}
}

希望得到帮助。:)

编辑:

我已经编辑了我的答案以与您的订阅源相匹配。应该有效。如果一切都好的话,别忘了接受答案

不要使用Html.fromHtml(),而是使用org.apache.commons.lang.StringEscapeUtils的unescapeHtml)。

请参阅此讨论是否有比html.fromHtml()更快的方法将html字符解码为字符串?

最新更新