gpt4 book ai didi

java - 如何使用 Retrofit 库解析 RSS xml 提要

转载 作者:行者123 更新时间:2023-12-05 00:14:21 29 4
gpt4 key购买 nike

我正在尝试使用 Retrofit API 解析 XML 提要,但我被阻止了,我不知道如何访问这些属性我认为问题出在根 RSS 上!

这是提要:http://www.ka-news.de/storage/rss/rss/karlsruhe.xml

主要 Activity 是我将数据(项目列表)传递给适配器的地方。

@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接口(interface):

public interface api {
@GET("/storage/rss/rss/karlsruhe.xml")
public Rss getRss();
}

我创建了三个实体:

channel :

@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 + '\'' +
'}';
}

订阅:

@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 上的那些帖子中找到了解决方案: First linkSecond link

已经创建了新的 api 和实体:

API接口(interface):

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;
}
}

和 channel 类:

@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;
}
}

当然,在我的主要 Activity 中,我会把它放在:

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();


}
});

我将在适配器构造函数上设置以在 ListView 或 RecyclerView 中显示的改造 api 从解析中获取的项目。

祝你好运

关于java - 如何使用 Retrofit 库解析 RSS xml 提要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35178057/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com