[英]Parsing RSS xml feed with Retrofit
我正在嘗試使用Retrofit api解析xml feed,但被阻止了,我不知道如何訪問這些屬性,我認為問題出在Ros Rss上!
這是供稿: http : //www.ka-news.de/storage/rss/rss/karlsruhe.xml
這是我的代碼,主要活動是將數據(項目列表)傳遞給適配器。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("http://www.ka-news.de")
.setConverter(new SimpleXmlConverter())
.setLogLevel(RestAdapter.LogLevel.FULL)
.build();
api apiService = restAdapter.create(api.class);
Rss rss = apiService.getRss();
List<Item> items = rss.getChannel().getItemList();
// Obtener el Recycler
recycler = (RecyclerView) rootView.findViewById(R.id.reciclador);
recycler.setHasFixedSize(true);
// Usar un administrador para LinearLayout
lManager = new LinearLayoutManager(getContext());
recycler.setLayoutManager(lManager);
// Crear un nuevo adaptador
adapter = new AnimeAdapter(items);
recycler.setAdapter(adapter);
rootView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT ));
return rootView;
}
api接口:
public interface api {
@GET("/storage/rss/rss/karlsruhe.xml")
public Rss getRss();
}
我創建了三個實體:
頻道:
@Root(strict = false)
public class Channel {
@ElementList(name = "item", required = true, inline = true)
public List<Item> itemList;
public List<Item> getItemList() {
return itemList;
}
public void setItemList(List<Item> itemList) {
this.itemList = itemList;
}
}
項目:
@Root(name = "item", strict = false)
public class Item {
@Element(name = "title", required = true)
String title;
@Element(name = "link", required = true)
String link;
@Element(name = "description", required = true)
String description;
@Element(name = "pubDate", required = false)
String pubDate;
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 getPubDate() {
return pubDate;
}
public void setPubDate(String pubDate) {
this.pubDate = pubDate;
}
@Override
public String toString() {
return "Item{" +
"title='" + title + '\'' +
", link='" + link + '\'' +
", description='" + description + '\'' +
", pubDate='" + pubDate + '\'' +
'}';
}
}
Rss:
@Root
public class Rss {
@Attribute
String version;
@Element
Channel channel;
public Channel getChannel() {
return channel;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public void setChannel(Channel channel) {
this.channel = channel;
}
@Override
public String toString() {
return "RSS{" +
"version='" + version + '\'' +
", channel=" + channel +
'}';
}
}
日志中顯示的問題是:
FATAL EXCEPTION: main
retrofit.RetrofitError
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:394)
at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)
at $Proxy1.getRss(Native Method)
at br.liveo.ndrawer.ui.fragment.MainFragment.onCreateView(MainFragment.java:109)
這條線:
Rss rss = apiService.getRss();
我從stackoverflow.com中的帖子中找到了啟發性的解決方案: 第一個鏈接和第二個鏈接
已經創建了新的api和實體:
api接口:
public interface RssAdapter{
@GET("/storage/rss/rss/karlsruhe.xml")
void getItems(Callback<Feed> callback);
}
飼料類別:
@Root(name = "rss", strict = false)
public class Feed implements Serializable {
@Element(name = "channel")
private Channel mChannel;
public Channel getmChannel() {
return mChannel;
}
public Feed() {
}
public Feed(Channel mChannel) {
this.mChannel = mChannel;
}
}
和頻道類別:
@Root(name = "channel", strict = false)
public class Channel implements Serializable {
@ElementList(inline = true, name="item")
private List<FeedItem> mFeedItems;
public List<FeedItem> getFeedItems() {
return mFeedItems;
}
public Channel() {
}
public Channel(List<FeedItem> mFeedItems) {
this.mFeedItems = mFeedItems;
}
}
最后一個是項目:
@Root(name = "item", strict = false)
public class FeedItem implements Serializable {
@Element(name = "pubDate")
private String mpubDate;
@Element(name = "title")
private String mtitle;
@Element(name = "link")
private String mlink;
@Element(name = "description")
private String mdescription;
public FeedItem() {
}
public FeedItem(String mdescription, String mlink, String mtitle, String mpubDate) {
this.mdescription = mdescription;
this.mlink = mlink;
this.mtitle = mtitle;
this.mpubDate = mpubDate;
}
public String getMpubDate() {
return mpubDate;
}
public void setMpubDate(String mpubDate) {
this.mpubDate = mpubDate;
}
public String getMtitle() {
return mtitle;
}
public void setMtitle(String mtitle) {
this.mtitle = mtitle;
}
public String getMlink() {
return mlink;
}
public void setMlink(String mlink) {
this.mlink = mlink;
}
public String getMdescription() {
return mdescription;
}
public void setMdescription(String mdescription) {
this.mdescription = mdescription;
}
}
當然,在我的主要活動中,我會指出:
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("http://www.ka-news.de")
.setConverter(new SimpleXmlConverter())
.build();
RssAdapter rssAdapter = restAdapter.create(RssAdapter.class);
rssAdapter.getItems(new Callback<Feed>() {
@Override
public void success(Feed newsitems, Response response) {
Toast.makeText(getContext(), "oki", Toast.LENGTH_LONG).show();
List<FeedItem> mItems = new ArrayList<>();
mItems = newsitems.getmChannel().getFeedItems();
// Crear un nuevo adaptador
adapter = new AnimeAdapter(mItems);
recycler.setAdapter(adapter);
}
@Override
public void failure(RetrofitError error) {
System.out.println(error);
Toast.makeText(getContext(), "Error" + error.getMessage(), Toast.LENGTH_LONG).show();
}
});
我將在適配器構造函數上設置使用改造API從解析中獲取的項目,以在listview或RecyclerView中顯示該項目。
祝好運
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.