Czytnik RSS

0

Siemano! Mam ogromny problem:D Znaczy. Problem jest banalny, ale czuję się zagubiony w tym kodzie. Pierwszy raz pisałem coś większego niż "dziennik klasowy".
Więc tak. Bazując na wzorcu projektowym napisałem czytnik RSS - w sumie to miałem napisać, a wyszło co wyszło. Przy uruchomieniu programu dostaję dziwy, dziwoty. Przykładowy wers wydruku:

FeedMessage: [title= Układanka prezesa z ludźmi pani premier, Description= <img src="http://i.wp.pl/a/f/jpeg/35926/kaczynski_szydlo_pap_625.jpeg" width="120" align="left"/>To mieszanka nazwisk, które ucieszą twardy i umiarkowany elektorat - pisze "Rzeczpospolita" o rządzie PiS. <a href="http://wiadomosci.wp.pl">wiadomosci.wp.pl</a>, Link= http://wiadomosci.wp.pl/kat,1342,title,Ukladanka-prezesa-z-ludzmi-pani-premier,wid,17963258,wiadomosc.html, Author: , Guid= http://wiadomosci.wp.pl/kat,1342,title,Ukladanka-prezesa-z-ludzmi-pani-premier,wid,17963258,wiadomosc.html

Gdzieś namieszałem, ale gdzie? Nie mogę odnaleźć błędu. Byłby ktoś taki miły?

public class ReadTest {

    public static void main(String[] args) {
        RSSFeedParser parser = new RSSFeedParser("http://wiadomosci.wp.pl/ver,rss,rss.xml");
        Feed feed = parser.readFeed();
        System.out.println(feed);
        for (FeedMessage message : feed.getMessages()) {
            System.out.println(message);
            RSSFeedWriter writer = new RSSFeedWriter(feed, "articles.rss");
            try {
                writer.write();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}
public class Feed {

    final String title;
    final String description;
    final String link;
    final String language;
    final String copyright;
    final String pubDate;

    final List<FeedMessage> entries = new ArrayList<FeedMessage>();

    public Feed(String title, String description, String link, String language, String copyright, String pubDate){
        this.title=title;
        this.description=description;
        this.link=link;
        this.language=language;
        this.copyright=copyright;
        this.pubDate=pubDate;
    }
    public List<FeedMessage> getMessages(){
        return entries;
    }
    public String getTitle(){
        return title;
    }
    public String getDescription(){
        return description;
    }
    public String getLink(){
        return link;
    }
    public String getLanguage(){
        return language;
    }
    public String getCopyright(){
        return copyright;
    }
    public String getPubDate(){
        return pubDate;
    }
    public String toString(){
        return "Freed: [Title: " +title+", Description: "+description+", Copyright: "+copyright+", Language: "+language+", PubDate: "+pubDate;
    }
}

public class FeedMessage {
    String title;
    String description;
    String link;
    String author;
    String guid;

    public void setTitle(String title){
        this.title=title;
    }
    public String getTitle(){
        return title;
    }
    public void setDescription(String description){
        this.description=description;
    }
    public String getDescription(){
        return description;
    }
    public void setLink(String link){
        this.link=link;
    }
    public String getLink(){
        return link;
    }
    public void setAuthor(String author){
        this.author=author;
    }
    public String getAuthor(){
        return author;
    }
    public void setGuid(String guid){
        this.guid=guid;
    }
    public String getGuid(){
        return guid;
    }
    public String toString(){
        return "FeedMessage: [title= "+title+", Description= "+description+", Link= "+link+", Author: "+author+", Guid= "+guid;
    }


}
public class RSSFeedParser {

    static final String TITLE = "title";
    static final String DESCRIPTION = "description";
    static final String CHANNEL = "channel";
    static final String LANGUAGE = "language";
    static final String COPYRIGHT = "copyright";
    static final String LINK = "link";
    static final String AUTHOR = "author";
    static final String ITEM = "item";
    static final String PUB_DATE = "pubDate";
    static final String GUID = "guid";

    final URL url;

    public RSSFeedParser(String feedUrl) {
        try {
            url = new URL(feedUrl);
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        }
    }

    public Feed readFeed() {

        Feed feed = null;
        try {
            boolean isFeedHeader = true;
            String description = "";
            String title = "";
            String link = "";
            String language = "";
            String copyright = "";
            String author = "";
            String pubDate = "";
            String guid = "";
            


            XMLInputFactory inputFactory = XMLInputFactory.newInstance();
            InputStream in = read();
            XMLEventReader eventReader = inputFactory.createXMLEventReader(in);


            while (eventReader.hasNext()) {
                XMLEvent event = eventReader.nextEvent();
                if (event.isStartElement()) {
                    String localPart = event.asStartElement().getName().getLocalPart();
                    switch (localPart) {
                        case ITEM:
                            if (isFeedHeader) {
                                isFeedHeader = false;
                                feed = new Feed(title, link, description, language, copyright, pubDate);
                            }
                                event = eventReader.nextEvent();
                            break;
                        case TITLE:
                            title = getCharacterData(event, eventReader);
                            break;
                        case DESCRIPTION:
                            description = getCharacterData(event, eventReader);
                            break;
                        case LINK:
                            link = getCharacterData(event, eventReader);
                            break;
                        case GUID:
                            guid = getCharacterData(event, eventReader);
                            break;
                        case LANGUAGE:
                            language = getCharacterData(event, eventReader);
                            break;
                        case AUTHOR:
                            author = getCharacterData(event, eventReader);
                            break;
                        case PUB_DATE:
                            pubDate = getCharacterData(event, eventReader);
                            break;
                        case COPYRIGHT:
                            copyright = getCharacterData(event, eventReader);
                            break;
                            }
                    }
                    else if(event.isEndElement()) {
                    if (event.asEndElement().getName().getLocalPart() == (ITEM)) {
                        FeedMessage message = new FeedMessage();
                        message.setAuthor(author);
                        message.setDescription(description);
                        message.setGuid(guid);
                        message.setLink(link);
                        message.setTitle(title);
                        feed.getMessages().add(message);
                    }

                }
            }
        } catch (XMLStreamException e) {
            throw new RuntimeException(e);
        }
    return feed;
    }

    private InputStream read(){
        try{
            return url.openStream();
        }catch (IOException e){
            throw new RuntimeException(e);
        }
    }
    private String getCharacterData(XMLEvent event, XMLEventReader eventReader) throws XMLStreamException {
        String results="";
        event = eventReader.nextEvent();
        if(event instanceof Characters){
            results = event.asCharacters().getData();
        }
        return results;
    }
}


public class RSSFeedWriter {
    private String outputFile;
    private Feed rssfeed;

    public RSSFeedWriter(Feed rssfeed, String outputFile){
        this.rssfeed=rssfeed;
        this.outputFile=outputFile;
    }

    public void write() throws Exception {
        XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
        XMLEventWriter eventWriter = outputFactory.createXMLEventWriter(new FileOutputStream(outputFile));
        XMLEventFactory eventFactory = XMLEventFactory.newInstance();
        XMLEvent end = eventFactory.createDTD("");

        StartDocument startDocument = eventFactory.createStartDocument();
        eventWriter.add(startDocument);
        eventWriter.add(end);

        StartElement rssStart = eventFactory.createStartElement("", "", "rss");
        eventWriter.add(rssStart);
        eventWriter.add(eventFactory.createAttribute("version", "2.0"));
        eventWriter.add(end);

        eventWriter.add(eventFactory.createStartElement("", "", "channel"));
        eventWriter.add(end);

        createNode(eventWriter, "title", rssfeed.getTitle());
        createNode(eventWriter, "link", rssfeed.getLink());
        createNode(eventWriter, "copyright", rssfeed.getCopyright());
        createNode(eventWriter, "description", rssfeed.getDescription());
        createNode(eventWriter, "pub_Date", rssfeed.getPubDate());

        for (FeedMessage entry : rssfeed.getMessages()) {
            eventWriter.add(eventFactory.createStartElement("", "", "item"));
            eventWriter.add(end);
            createNode(eventWriter, "title", entry.getTitle());
            createNode(eventWriter, "description", entry.getDescription());
            createNode(eventWriter, "link", entry.getLink());
            createNode(eventWriter, "author", entry.getAuthor());
            createNode(eventWriter, "guid", entry.getGuid());
            eventWriter.add(end);
            eventWriter.add(eventFactory.createEndElement("", "", "item"));
            eventWriter.add(end);

        }

        eventWriter.add(end);
        eventWriter.add(eventFactory.createEndElement("", "", "channel"));
        eventWriter.add(end);
        eventWriter.add(eventFactory.createEndElement("", "", "rss"));
        eventWriter.add(end);
        eventWriter.add(eventFactory.createEndDocument());
        eventWriter.close();
    }

    private void createNode(XMLEventWriter eventWriter, String name, String value) throws XMLStreamException {
        XMLEventFactory eventFactory =  XMLEventFactory.newInstance();
        XMLEvent end = eventFactory.createDTD("\n");
        XMLEvent tab = eventFactory.createDTD("\t");
        StartElement startElement = eventFactory.createStartElement("", "", name);
        eventWriter.add(tab);
        eventWriter.add(startElement);
        Characters characters = eventFactory.createCharacters(value);
        eventWriter.add(characters);
        EndElement endElement = eventFactory.createEndElement("", "", name);
        eventWriter.add(endElement);
        eventWriter.add(end);
    }

}

Byłbym wdzięczny.

0

Odświeżam, ktoś byłby w stanie napisać/poprawić co jest nie tak?

0

Też kiedyś pisałem taki czytnik:

https://github.com/DanielMichalski/spring-web-rss-channels

1 użytkowników online, w tym zalogowanych: 0, gości: 1