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.