Puste pola w czytniku RSS

0

Siemano. Mam taki problem, właściwie to dwa. Pisząc czytnik RSS chciałem zastąpić case'y polimorfizmem. Teraz, gdy odpalam program sprawa wygląda tak, że przy próbie wydrukowania wiadomości otrzymuje puste pola. Wygląda to tak:
user image
Próbując namierzyć błąd okryłem, że każdy element(przypuśćmy tytuł) zawiera wszystkie dane jednego wiersza(czyli String odpowiedzialny za tytuł zawiera tytuł, opis, link, autora i guid. ) Próba wydrukowania Stringów powodzi się tylko w jednej metodzie, co jest zaznaczone komentarzem w moim kodzie. Wygląda to tak:
user image
Kodu jest dużo, tym bardziej docenię każdą pomoc.
Więc kolejno:

import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.XMLEvent;

/**
 * Created by Maciek on 2015-11-23.
 */
public interface Case {
    void feedData(RSSFeedParser rss) throws XMLStreamException;
}
  • Klasa "ITEM' - tu pewnie jest pies pogrzebany, bo przy tej klasie się męczyłem najbardziej. nie wiedziałem jak to wszystko zapisać żeby działało. wyszło co wyszło i jeśli miałbym to pisać jeszcze raz to nic bym w tym nie zmienił bo nie widzę błędu. nie widzę ale czuję.
import javax.xml.stream.XMLStreamException;

/**
 * Created by Maciek on 2015-11-23.
 */
public class ITEM implements Case {

    @Override
    public void feedData(RSSFeedParser rss) throws XMLStreamException {
        if (rss.isFeedHeader) {
            rss.isFeedHeader = false;
            rss.feed = new Feed(rss.title, rss.link, rss.description, rss.language, rss.copyright, rss.pubDate);
        }
        rss.event = rss.eventReader.nextEvent();

        if (rss.event.isEndElement()) {
            if (rss.event.asEndElement().getName().getLocalPart() == (rss.ITEM)) {
                try {
                    rss.setAllElements();
                } catch (XMLStreamException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

No i każda kolejna klasa wygląda tak samo, tylko że jest zmieniona nazwa Stringa:

import javax.xml.stream.XMLStreamException;
        import javax.xml.stream.events.XMLEvent;

/**
 * Created by Maciek on 2015-11-23.
 */
public class TITLE  implements Case {

    @Override
    public void feedData(RSSFeedParser rss) throws XMLStreamException {
        rss.title = rss.getCharacterData(rss.event, rss.eventReader);
        rss.eventReader.close();
    }
}

To mnie przerosło.

0

Wygląda to strasznie, nic dziwnego, że się męczyłeś...

A dzieje się tak:

  1. Ładujesz xmla i parsujesz go, żeby wyłuskać dane
  2. itemson.feedData(this);, w którym:
    2.a) tworzysz nowego feed'a w parserze z domyślnymi? danymi zapisanymi w statycznych atrybutach w parserze, które zawierają puste stringi
    2.b) rss.setAllElements();, w którym:
    2.b) i. tworzysz nowe FeedMessage, do których zapisujesz te same puste stringi ze statycznych wartości domyślnych? i dodajesz do wcześniej utworzonego feed'a
  3. Wreszcie odczytujesz dane ze swojego XMLa i zapisujesz je... do statycznych domyślnych? atrybutów w parserze
  4. Wypisujesz na stdout feed'a wcześniej uzupełnionego pustymi stringami...

Gdybyś ładował dwa feed'y, to w drugim zobaczyłbyś dane... z pierwszego. Nie wiem czy poprawne, ale coś byś zobaczył. Nie chce mi się już do tego wracać i dokładniej sprawdzać, masz dość informacji, żeby naprawić błąd...

Nawiasem mówiąc jaki jest sens tych statycznych atrybutów? Jeżeli w jakiś pokrętny sposób na prawdę planowałeś wczytywać tam dane (co odradzam), to one nie powinny być statyczne (skoro tworzysz obiekt parsera, to teoretycznie mógłbyś utworzyć kilka parserów w osobnych wątkach i dane by się mieszały). Jeżeli natomiast miały to być dane domyślne, to nie prościej po prostu zainicjalizować atrybuty w kodzie klasy Feed/FeedMessage niż tworzyć specjalne atrybuty (wszystkie z pustymi stringami) po to, żeby ich użyć do inicjalizowania tamtych atrybutów?

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