簡體   English   中英

android解析提要RSS圖像

[英]android parsing Feed RSS images

我正在使用這個庫https://github.com/matshofman/Android-RSS-Reader-Library來解析Feed RSS。 我試圖對其進行編輯以獲取圖像,但我不知道我是否使用正確的方式,也不知道如何編輯RssHandler.java。要解析的圖像包含在img標簽中。

謝謝您的幫助!

這里的代碼:

RssFeed.java

public class RssFeed implements Parcelable {

private String title;
private String link;
private String description;
private String language;
private String imageUrl;
private ArrayList<RssItem> rssItems;

public RssFeed() {
    rssItems = new ArrayList<RssItem>();
}

public RssFeed(Parcel source) {

    Bundle data = source.readBundle();
    title = data.getString("title");
    link = data.getString("link");
    description = data.getString("description");
    language = data.getString("language");
    imageUrl = data.getString("imageUrl");
    rssItems = data.getParcelableArrayList("rssItems");

}

@Override
public void writeToParcel(Parcel dest, int flags) {

    Bundle data = new Bundle();
    data.putString("title", title);
    data.putString("link", link);
    data.putString("description", description);
    data.putString("language", language);
    data.putString("imageUrl", imageUrl);
    data.putParcelableArrayList("rssItems", rssItems);
    dest.writeBundle(data);
}

public static final Parcelable.Creator<RssFeed> CREATOR = new Parcelable.Creator<RssFeed>() {
    public RssFeed createFromParcel(Parcel data) {
        return new RssFeed(data);
    }
    public RssFeed[] newArray(int size) {
        return new RssFeed[size];
    }
};

@Override
public int describeContents() {
    return 0;
}

void addRssItem(RssItem rssItem) {
    rssItems.add(rssItem);
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getLink() {
    return link;
}

public void setLink(String link) {
    this.link = link;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getLanguage() {
    return language;
}

public void setLanguage(String language) {
    this.language = language;
}

public String getImageUrl() {
    return imageUrl;
}

public void setImageUrl(String imageUrl) {
    this.imageUrl = imageUrl;
}

public ArrayList<RssItem> getRssItems() {
    return rssItems;
}

public void setRssItems(ArrayList<RssItem> rssItems) {
    this.rssItems = rssItems;
} 
}

RssItem.java

public class RssItem implements Comparable<RssItem>, Parcelable {

private RssFeed feed;
private String title;
private String link;
private Date pubDate;
private String description;
private String content;
private String imageUrl;

public RssItem() {

}

public RssItem(Parcel source) {

    Bundle data = source.readBundle();
    title = data.getString("title");
    link = data.getString("link");
    pubDate = (Date) data.getSerializable("pubDate");
    description = data.getString("description");
    content = data.getString("content");
    imageUrl = data.getString("imageUrl");
    feed = data.getParcelable("feed");

}

@Override
public void writeToParcel(Parcel dest, int flags) {

    Bundle data = new Bundle();
    data.putString("title", title);
    data.putString("link", link);
    data.putSerializable("pubDate", pubDate);
    data.putString("description", description);
    data.putString("content", content);
    data.putString("imageUrl", imageUrl);
    data.putParcelable("feed", feed);
    dest.writeBundle(data);
}

public static final Parcelable.Creator<RssItem> CREATOR = new Parcelable.Creator<RssItem>() {
    public RssItem createFromParcel(Parcel data) {
        return new RssItem(data);
    }
    public RssItem[] newArray(int size) {
        return new RssItem[size];
    }
};

@Override
public int describeContents() {
    return 0;
}

public RssFeed getFeed() {
    return feed;
}

public void setFeed(RssFeed feed) {
    this.feed = feed;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getLink() {
    return link;
}

public void setLink(String link) {
    this.link = link;
}

public String getImageUrl() {
    return imageUrl;
}

public void setImageUrl(String imageUrl) {
    this.imageUrl = imageUrl;
}

public Date getPubDate() {
    return pubDate;
}

public void setPubDate(Date pubDate) {
    this.pubDate = pubDate;
}

public void setPubDate(String pubDate) {
    try {
        SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
        this.pubDate = dateFormat.parse(pubDate);
    } catch (ParseException e) {
        e.printStackTrace();
    }
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getContent() {
    return content;
}

public void setContent(String content) {
    this.content = content;
}

@Override
public int compareTo(RssItem another) {
    if(getPubDate() != null && another.getPubDate() != null) {
        return getPubDate().compareTo(another.getPubDate());
    } else { 
        return 0;
    }
}

}

RssReader.java

public class RssReader {

public static RssFeed read(URL url) throws SAXException, IOException {

    return read(url.openStream());

}

public static RssFeed read(InputStream stream) throws SAXException, IOException {

    try {

        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        XMLReader reader = parser.getXMLReader();
        RssHandler handler = new RssHandler();
        InputSource input = new InputSource(stream);

        reader.setContentHandler(handler);
        reader.parse(input);

        return handler.getResult();

    } catch (ParserConfigurationException e) {
        throw new SAXException();
    }

}

}

RssHandler.java

public class RssHandler extends DefaultHandler {

private RssFeed rssFeed;
private RssItem rssItem;
private StringBuilder stringBuilder;

@Override
public void startDocument() {
    rssFeed = new RssFeed();
}

/**
 * Return the parsed RssFeed with it's RssItems
 * @return
 */
public RssFeed getResult() {
    return rssFeed;
}

@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) {
    stringBuilder = new StringBuilder();

    if(qName.equals("item") && rssFeed != null) {
        rssItem = new RssItem();
        rssItem.setFeed(rssFeed);
        rssFeed.addRssItem(rssItem);
    }
}

@Override
public void characters(char[] ch, int start, int length) {
    stringBuilder.append(ch, start, length);
}

@Override
public void endElement(String uri, String localName, String qName) {

    if(rssFeed != null && rssItem == null) {
        // Parse feed properties

        try {
            if (qName != null && qName.length() > 0) {
                String methodName = "set" + qName.substring(0, 1).toUpperCase() + qName.substring(1);
                Method method = rssFeed.getClass().getMethod(methodName, String.class);
                method.invoke(rssFeed, stringBuilder.toString());
            }
        } catch (SecurityException e) {
        } catch (NoSuchMethodException e) {
        } catch (IllegalArgumentException e) {
        } catch (IllegalAccessException e) {
        } catch (InvocationTargetException e) {
        }

    } else if (rssItem != null) {
        // Parse item properties

        try {
            if(qName.equals("content:encoded")) 
                qName = "content";
            String methodName = "set" + qName.substring(0, 1).toUpperCase() + qName.substring(1);
            Method method = rssItem.getClass().getMethod(methodName, String.class);
            method.invoke(rssItem, stringBuilder.toString());
        } catch (SecurityException e) {
        } catch (NoSuchMethodException e) {
        } catch (IllegalArgumentException e) {
        } catch (IllegalAccessException e) {
        } catch (InvocationTargetException e) {
        }
    }

}

}

您可以通過XML解析器或復雜的正則表達式從標記中獲取圖像。

嘗試將此庫用於RSS: https : //github.com/Pkmmte/PkRSS

它易於使用,並且默認情況下適用於大多數提要。 您也可以插入自己的解析器以獲取自定義內容。 該庫中的解析器Java文件提供了一個示例,說明了我使用Android的XmlPullParser獲取圖像標簽內容的含義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM