RSS Parser in Java
Ein kleiner RSS-Parser inklusive Grafischer Oberfläche. Die Einträge werden mit einem Swing TableModel dargestellt.
Screenshot
Klasse RSSItem
/** * Enthält die Informationen zu einem Item innerhalb einer RSS-Datei. */ class RSSItem { private String title = null; private String url = null; private String description = null; public RSSItem() {} public RSSItem(String title,String url,String description) { this.title = title; this.url = url; this.description = description; } public void setTitle(String title) { this.title = title; } public String getTitle() { return title; } public void setURL(String url) { this.url = url; } public String getURL() { return url; } public void setDescription(String description) { this.description = description; } public String getDescription() { return description; } }
Klasse RSSParser
import java.io.*; import org.xml.sax.*; import org.xml.sax.helpers.*; import javax.xml.parsers.*; import java.util.ArrayList; /** * Parst eine RSS-Datei im RSS 0.9 oder 0.91 Format (ohne Verwendung von * Namespaces). */ class RSSParser extends DefaultHandler { private ArrayList items = null; private RSSItem currentItem = null; private RSSItem channel = null; /** Character Data innerhalb des aktuellen Tags. */ private StringBuffer stringBuffer = null; private boolean inItem = false; private boolean inChannel = false; public RSSParser(String path) { // currentItem wird in startElement initialisiert items = new ArrayList(); stringBuffer = new StringBuffer(); try { // Neuen SAX-Parser erzeugen SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); // XML Datei parsen, die entsprechenden Methoden des DefaultHandler // werden als Callback aufgerufen. // TODO: Validierung deaktivieren, da sonst versucht wird eine DTD // aus dem Internet zu laden. System.out.println("Parsing " + path); saxParser.parse(path,this); } catch (Exception e) { //System.out.println(e); e.printStackTrace(); } } public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { // "...".equals() vermeidet die Auslösung von NullPointerException beim Vergleich. if ("channel".equals(qName)) { channel = new RSSItem(); inChannel = true; } else if ("item".equals(qName)) { currentItem = new RSSItem(); inItem = true; } stringBuffer.setLength(0); // System.out.println("startElement : " + qName); } public void endElement(String namespaceURI, String localName, String qName) { if ("channel".equals(qName)) { inChannel = false; } else if ("item".equals(qName)) { items.add(currentItem); inItem = false; } else if (inItem) { String str = stringBuffer.toString().trim(); if ("title".equals(qName)) { currentItem.setTitle(str); } else if ("link".equals(qName)) { currentItem.setURL(str); } else if ("description".equals(qName)) { currentItem.setDescription(str); } } else if (inChannel) { String str = stringBuffer.toString().trim(); if ("title".equals(qName)) { channel.setTitle(str); } else if ("link".equals(qName)) { channel.setURL(str); } else if ("description".equals(qName)) { channel.setDescription(str); } } // System.out.println("endElement : " + qName); } public void characters(char ch[], int start, int length) { if (inItem || inChannel) { stringBuffer.append(ch,start,length); } } /** Gibt Informationen über diesen Channel als <code>RSSItem</code> zurück. */ public RSSItem getChannel() { return channel; } /** Gibt das Item mit dem Index <code>i</code> zurück. */ public RSSItem getItem(int i) { return (RSSItem)items.get(i); } /** Gibt die Anzahl Items zurück. */ public int itemCount() { return items.size(); } }
Klasse RSSTableModel
/** * TableModel für Daten im RSS-Format. Die Tabelle hat drei Spalten für Titel, URL und Beschreibung. */ public class RSSTableModel extends javax.swing.table.AbstractTableModel { private static final int COLUMNCOUNT = 3; private static final String[] COLUMNNAMES = new String[]{"Title","URL","Description"}; private RSSParser parser = null; /** Lädt die angegebene Datei mit dem <code>RSSParser</code>. */ public RSSTableModel(String path) { parser = new RSSParser(path); } /** * Gibt die Beschreibung dieses Channels als <code>RSSItem</code> zurück. * Der Channel enthält genau wie die einzelnen Items die Felder Titel, URL * und Beschreibung. */ public RSSItem getChannel() { return parser.getChannel(); } public int getColumnCount() { return COLUMNCOUNT; } public int getRowCount() { return parser.itemCount(); } public String getColumnName(int col) { return COLUMNNAMES[col]; } /** * Gibt immer <code>false</code> zurück. */ public boolean isCellEditable(int row, int col) { return false; } public void setValueAt(Object aValue, int row, int col) { } public Object getValueAt(int row, int col) { RSSItem item = parser.getItem(row); switch (col) { case 0: return item.getTitle(); case 1: return item.getURL(); case 2: return item.getDescription(); } return ""; } /** * Gibt immer die String-Klasse zurück. */ public Class getColumnClass(int c) { return "".getClass(); } }
Klasse Main
/** * GUI für das <code>RSSTableModel</code>. */ public class Main extends javax.swing.JFrame { private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTable jTable1; private RSSTableModel model; /** * Erzeugt einen <code>JFrame</code> der eine scrollbare <code>JTable</code> enthält. */ public Main(String path) { jScrollPane1 = new javax.swing.JScrollPane(); jTable1 = new javax.swing.JTable(); model = new RSSTableModel(path); jTable1.getTableHeader().setReorderingAllowed(false); getContentPane().setLayout(new java.awt.GridLayout(1, 0)); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent e) { System.exit(0); } }); jScrollPane1.setMinimumSize(new java.awt.Dimension(200, 100)); jScrollPane1.setPreferredSize(new java.awt.Dimension(200, 100)); jTable1.setModel(model); jTable1.setMinimumSize(new java.awt.Dimension(150, 100)); jTable1.setPreferredScrollableViewportSize(new java.awt.Dimension(0, 0)); jScrollPane1.setViewportView(jTable1); getContentPane().add(jScrollPane1); setTitle("RSS-Parser - " + model.getChannel().getTitle()); pack(); } public static void main(String args[]) { if (args.length != 1) { System.out.println("Aufruf mit RSS-Datei als Parameter"); System.exit(1); } new Main(args[0]).show(); } }