RSS Demon: Difference between revisions

From Mobile Application Design
Jump to navigationJump to search
No edit summary
 
No edit summary
Line 1: Line 1:
* RSS Demon requires that you add the kXML library to your project.  
* RSS Demon requires that you add the kXML library to your project.  
* Download kXML2 here: http://sourceforge.net/project/showfiles.php?group_id=9157&package_id=58653
* Download kXML2 here: http://sourceforge.net/project/showfiles.php?group_id=9157
 
<pre>
/**
* RSS Demon
* a modified version of my XMLDemon example uses kXML2 to parse RSS feeds
*
* NOTE: Uses techniques and code from Tommi Laukkanen's RSS Reader - http://www.substanceofcode.com
* copyleft Michael Sharon 2006
*/
 
package my;
 
import java.io.*;
import java.util.Vector;
 
import org.kxml2.io.*;
import org.xmlpull.v1.*;
 
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
 
public class RSSDemon extends MIDlet implements CommandListener {
 
//add any RSS feed here
//NY Times Music Feed
static final String rssFeedURL = "http://www.nytimes.com/services/xml/rss/nyt/Music.xml";
//BBC News Feed
//static final String rssFeedURL = "http://newsrss.bbc.co.uk/rss/newsonline_world_edition/front_page/rss.xml";
//An empty feed which will cause an error
//static final String rssFeedURL = "http://uberthings.com/teaching/mobile_application_design/7/empty.xml";
//BBC
//The title of your RSS feed
static final String TITLE = "NY Times Music";
 
//Vector stores a variable number of items from the feed
Vector foundItems = new Vector();
//Holds all our items
List itemList = new List(TITLE, Choice.IMPLICIT);
TextBox textBox = new TextBox("", "", 256, TextField.ANY);
Display display;
 
Command backCmd = new Command("Back", Command.BACK, 0);
 
public void startApp() {
//get a reference to the display object
display = Display.getDisplay(this);
//set up listeners and commands
itemList.setCommandListener(this);
textBox.setCommandListener(this);
textBox.addCommand(backCmd);
//show the list of items
display.setCurrent(itemList);
//create a new thread and start it
new ReadThread().start();
}
 
public void pauseApp() {
}
 
public void commandAction(Command c, Displayable d) {
 
if (c == List.SELECT_COMMAND) {
 
//retrieve the specific item that we have selected
String text = (String) foundItems.elementAt(itemList.getSelectedIndex());
 
if (textBox.getMaxSize() < text.length())
textBox.setMaxSize(text.length());
 
textBox.setString(text);
display.setCurrent(textBox);
} else if (c == backCmd)
display.setCurrent(itemList);
}
 
public void destroyApp(boolean really) {
}
class ReadThread extends Thread {
 
public void run() {
try {
HttpConnection httpConnection = (HttpConnection) Connector.open(rssFeedURL);
KXmlParser parser = new KXmlParser();
 
System.out.println("Grabbing XML and parsing");
parser.setInput(new InputStreamReader(httpConnection.openInputStream()));
System.out.println("looking for first tag");
 
/** <?xml...*/
        parser.nextTag();
 
        //ignore other tags, wait for <item> tag
        parser.require(parser.START_TAG, null, null);
        while(!"item".equals(parser.getName()) ){
            /** Check if document doesn't include any item tags */
            if( parser.next() == parser.END_DOCUMENT )
                throw new IOException("No items in RSS feed!");
        }
        /** Parse <item> tags */
        do {
        readItem(parser);   
        } while("item".equals(parser.getName()));
 
} catch (Exception e) {
e.printStackTrace();
foundItems.addElement(e.toString());
itemList.append("Error", null);
}
}
 
// Read a story and append it to the list
void readItem(KXmlParser parser)
throws IOException, XmlPullParserException {
 
parser.require(parser.START_TAG, null, null);
 
String title = null;
String description = null;
 
            // Handles one <item> tag at a time
            while (parser.nextTag() != parser.END_TAG) {
                parser.require(parser.START_TAG, null, null);
                String name = parser.getName();
                String text = parser.nextText();
               
                //replace HTML entities
                text = replace(text, "&auml;", "‰");
                text = replace(text, "&ouml;", "ˆ");
                text = replace(text, "√§", "‰");
                text = replace(text, "√∂", "ˆ");
               
                // Save item property values
                if (name.equals("title")) {
                    title = text;
                }
                else if (name.equals("description")) {
                    description = text;
                }
 
                parser.require(parser.END_TAG, null, name);
            }
           
            // Debugging information
            System.out.println ("Title:      " + title);
            System.out.println ("Description: " + description);
 
            if (title != null) {
foundItems.addElement(""+description);
itemList.append(title, null);
}
           
            parser.nextTag();
}
}
 
  /* Replace all instances of a String in a String.
    *  @param  s  String to alter.
    *  @param  f  String to look for.
    *  @param  r  String to replace it with, or null to just remove it.
    */ 
    public static String replace( String s, String f, String r )
    {
      if (s == null)  return s;
      if (f == null)  return s;
      if (r == null)  r = "";
 
      int index01 = s.indexOf( f );
      while (index01 != -1)
      {
          s = s.substring(0,index01) + r + s.substring(index01+f.length());
          index01 += r.length();
          index01 = s.indexOf( f, index01 );
      }
      return s;
    } 
   
}
</pre>

Revision as of 08:33, 10 April 2007