【问题标题】:How to parse RSS xml feed using Retrofit lib如何使用 Retrofit lib 解析 RSS xml 提要
【发布时间】:2021-10-20 18:30:36
【问题描述】:

我正在尝试使用 Retrofit API 解析 XML 提要,但我被阻止了,我不知道如何访问这些属性,我认为问题在于根 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();

【问题讨论】:

    标签: java android xml rss retrofit


    【解决方案1】:

    我从 stackoverflow.com 中的帖子中找到了解决方案: First linkSecond link

    已经创建了新的 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 从解析中获得的项目,以在列表视图或 RecyclerView 中显示。

    祝你好运

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-08
      • 1970-01-01
      • 2016-01-17
      • 2015-09-21
      • 2017-10-28
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多