2012-08-05 214 views
2

我正在尝试制作一个读取RSS源的ANDROID应用程序,所以我使用本教程(http://android-er.blogspot.com/2010/05/simple-rss-reader-ii-implement-with.html)并将其实施到我自己的url rss feeder。但是描述标签没有被显示出来......在馈线的xml中,几乎是cz,描述标签是CDATA。我如何解析描述cdata在我的rss ??谢谢! 这里是我的RSSHandler代码:解析Android中的CDATA RSS

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; 
    } 

这里是我RSSReader代码:

 public class AndroidRssReader extends ListActivity { 

private RSSFeed myRssFeed = null; 
//private ArrayList<RSSItem> myRssFeed = null; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    try { 
     //URL rssUrl = new URL("http://www.gov.hk/en/about/rss/govhkrss.data.xml"); 
     URL rssUrl = new URL("http://www.merehbi.com/online/index.php?option=com_content&view=category&layout=blog&id=58&Itemid=155&lang=ar&format=feed&type=rss"); 
     SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance(); 
     SAXParser mySAXParser = mySAXParserFactory.newSAXParser(); 
     XMLReader myXMLReader = mySAXParser.getXMLReader(); 
     RSSHandler myRSSHandler = new RSSHandler(); 
     myXMLReader.setContentHandler(myRSSHandler); 
     InputSource myInputSource = new InputSource(rssUrl.openStream()); 
     myXMLReader.parse(myInputSource); 

    myRssFeed = myRSSHandler.getFeed(); 
    } catch (MalformedURLException e) { 
     e.printStackTrace();  
    } catch (ParserConfigurationException e) { 
     e.printStackTrace();  
    } catch (SAXException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace();  
    } 

    if (myRssFeed!=null) 
    { 
     TextView feedTitle = (TextView)findViewById(R.id.feedtitle); 
     TextView feedDescribtion = (TextView)findViewById(R.id.feeddescribtion); 
     TextView feedPubdate = (TextView)findViewById(R.id.feedpubdate); 
     TextView feedLink = (TextView)findViewById(R.id.feedlink); 
     feedTitle.setText(myRssFeed.getTitle()); 
     feedDescribtion.setText(myRssFeed.getDescription()); 
     feedPubdate.setText(myRssFeed.getPubdate()); 
     feedLink.setText(myRssFeed.getLink()); 

     ArrayAdapter<RSSItem> adapter = 
       new ArrayAdapter<RSSItem>(this, 
         android.R.layout.simple_list_item_1,myRssFeed.getList()); 
     setListAdapter(adapter);  
    } 
} 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    Intent intent = new Intent(this,ShowDetails.class); 
    Bundle bundle = new Bundle(); 
    bundle.putString("keyTitle", myRssFeed.getItem(position).getTitle()); 
    bundle.putString("keyDescription", myRssFeed.getItem(position).getDescription()); 
    bundle.putString("keyLink", myRssFeed.getItem(position).getLink()); 
    bundle.putString("keyPubdate", myRssFeed.getItem(position).getPubdate()); 
    intent.putExtras(bundle); 
    startActivity(intent); 
} 
    } 
+0

任何人都可以帮我吗? :) – Beast 2012-08-06 07:55:52

+0

你有任何工作解决方案?如果是的话请帮助我。与之相同:( – 2013-06-12 06:26:22

+0

对于RSS订阅3.6MB非常大,顺便说一下 – 2014-07-26 08:46:40

回答

-2

我使用本教程及其代码 http://www.androidhive.info/2011/11/android-xml-parsing-tutorial/

,并通过这个答案修改一些代码 https://stackoverflow.com/a/8489223/3636653

 public static void main(String[] args) throws Exception { 
    File file = new File("data.xml"); 
    DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
    Document doc = builder.parse(file); 

    NodeList nodes = doc.getElementsByTagName("topic"); 
    for (int i = 0; i < nodes.getLength(); i++) { 
     Element element = (Element) nodes.item(i); 
     NodeList title = element.getElementsByTagName("title"); 
     Element line = (Element) title.item(0); 
     System.out.println("Title: " + getCharacterDataFromElement(line)); 
    } 
    } 
    public static String getCharacterDataFromElement(Element e) { 
    Node child = e.getFirstChild(); 
    if (child instanceof CharacterData) { 
     CharacterData cd = (CharacterData) child; 
     return cd.getData(); 
    } 
    return ""; 
    } 
+0

你的回答不完整 – Ali786 2014-07-26 08:52:58