2015-11-04 94 views
0

我已經搜索了很多,但是我無法將我的XML與My Classes一起分配,並且在嘗試反序列化XML時從改造中獲取錯誤。無法讀取rss XML,使用簡單的XML和翻新

這是我從我的接口(僅第一項)調用的XML:

<?xml version="1.0" encoding="UTF-8"?> 
<rss version="2.0" 
xmlns:content="http://purl.org/rss/1.0/modules/content/" 
xmlns:wfw="http://wellformedweb.org/CommentAPI/" 
xmlns:dc="http://purl.org/dc/elements/1.1/" 
xmlns:atom="http://www.w3.org/2005/Atom" 
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" 
xmlns:slash="http://purl.org/rss/1.0/modules/slash/" 
> 
<channel> 
    <title>Flow</title> 
    <atom:link href="http://flow.com/?feed=single_gallery_feed&#038;paged=0" rel="self" type="application/rss+xml" /> 
    <link>http://flow.com</link> 
    <description></description> 
    <lastBuildDate>Mon, 02 Nov 2015 17:07:54 +0000</lastBuildDate> 
    <language>en-US</language> 
    <sy:updatePeriod>hourly</sy:updatePeriod> 
    <sy:updateFrequency>1</sy:updateFrequency> 
    <generator>http://wordpress.org/?v=4.3.1</generator> 
    <item> 
     <title>Pocket Rocket Power</title> 
     <link>http://flow.com/portfolio/pocket-rocket-power/</link> 
     <comments>http://flow.com/portfolio/pocket-rocket-power/#comments</comments> 
     <pubDate>Mon, 02 Nov 2015 17:06:17 +0000</pubDate> 
     <dc:creator></dc:creator> 
     <category><![CDATA[Accessories]]></category> 
     <category><![CDATA[Car Accessories]]></category> 
     <category><![CDATA[Cool Gadgets]]></category> 
     <category><![CDATA[Crowdfunding Projects]]></category> 
     <category><![CDATA[Gift Ideas $20 - $50]]></category> 
     <category><![CDATA[iPad Accessories]]></category> 
     <category><![CDATA[iPhone 4/4s]]></category> 
     <category><![CDATA[iPhone 5/5s]]></category> 
     <category><![CDATA[iPhone 6/6s Accessories]]></category> 
     <category><![CDATA[iPhone Accessories]]></category> 
     <category><![CDATA[Made in USA]]></category> 
     <category><![CDATA[Power Banks]]></category> 
     <category><![CDATA[Recommended]]></category> 
     <category><![CDATA[Samsung Accessories]]></category> 
     <category><![CDATA[Travel Must Haves]]></category> 
     <guid isPermaLink="false">http://flow.com/?p=81755</guid> 
     <content:encoded><![CDATA[<img class="gf-rss-single-image" src="http://cdn.flow.com/wp-content/uploads/2015/11/Pocket-Rocket-Power-01.jpeg" /><img class="gf-rss-single-image" src="http://cdn.flow.com/wp-content/uploads/2015/11/Pocket-Rocket-Power-02.jpeg" /><img class="gf-rss-single-image" src="http://cdn.flow.com/wp-content/uploads/2015/11/Pocket-Rocket-Power-03.jpeg" /><img class="gf-rss-single-image" src="http://cdn.flow.com/wp-content/uploads/2015/11/Pocket-Rocket-Power-04.jpeg" /><img class="gf-rss-single-image" src="http://cdn.flow.com/wp-content/uploads/2015/11/Pocket-Rocket-Power-05.jpeg" /><img class="gf-rss-single-image" src="http://cdn.flow.com/wp-content/uploads/2015/11/Pocket-Rocket-Power-06.jpeg" /><div class="gf-rss-price">Price: $<span class="gf-price">25</span></div><img width="1300" height="1000" src="http://cdn.flow.com/wp-content/uploads/2015/11/Pocket-Rocket-Power-03.jpeg" class="attachment-full wp-post-image" alt="Pocket Rocket Power 03" style="float:none; margin:0 0 15px; display:block;" /> 
     ]]></content:encoded> 
    <slash:comments>0</slash:comments> 
</item> 

所以我使用異步方法採取了回調的項目,這是Java接口:

這是正在生成的界面處的REST客戶端類:

public class RestClient { 

private ApiService apiService; 

public RestClient(){ 
    RestAdapter restAdapter = new RestAdapter.Builder() 
      .setLogLevel(RestAdapter.LogLevel.FULL) 
      .setClient(new OkClient(new OkHttpClient())) 
      .setEndpoint("http://flow.com") 
      .setConverter(new SimpleXMLConverter()) 
      .build(); 

    apiService = restAdapter.create(ApiService.class); 
} 

public ApiService getApiService(){ 
    return apiService; 
} 
} 

另外,我還創造了一些模型類從XML主辦的標籤,我省略吸氣劑:

@Root(name="rss", strict = false) 
public class Rss { 

    @Element(name="channel") 
    private Channel channel; 

} 
@Root(name = "item", strict = false) 
public class Item { 

@Element(name = "title") 
private String title; 
@Element(name = "link") 
private String link; 
@Element(name = "comments") 
private String comments; 
@Element(name = "pubDate") 
private String pubDate; 
} 

@Root(name="channel", strict = false) 
public class Channel { 

@ElementList(name="item",inline = true) 
private ArrayList<Item> items; 
} 

最後,我呼籲在MainActivity服務:

public class MainActivity extends AppCompatActivity { 

private ArrayList<Item> mList; 
private Button pagerButton; 
private int page = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    pagerButton = (Button)findViewById(R.id.pager); 
    pagerButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      RestClient restClient = new RestClient(); 
      Callback<Channel> callback = new Callback<Channel>() { 
       @Override 
       public void success(Channel gadgets, Response response) { 
        mList = gadgets.getItems(); 
       } 

       @Override 
       public void failure(RetrofitError error) { 
        Log.d("billy",error.getLocalizedMessage()); 
       } 
      }; 
      restClient.getApiService().getGadgets(page,callback); 
        page++; 
     } 
    }); 

    if(mList != null) { 
     for(int i = 0; i < mList.size();i++) { 
      //mList = mItem.getGadgets(); 
      Log.d("billy", "Item : " + String.valueOf(i)); 
      Log.d("billy", "Title: " + mList.get(i).getTitle()); 
      Log.d("billy", "PubDate: " + mList.get(i).getPubDate()); 
      Log.d("billy", "ImageURL: " + mList.get(i).getLink()); 
      Log.d("billy","-------------------------------------------------------------------- "); 
     } 
    } 

} 
} 

所以,我把這個錯誤從改造:

org.simpleframework.xml.core.ValueRequiredException:無法滿足@ org.simpleframework.xml.ElementList(數據=假,空=真,進入=,=內嵌真正的,名稱=項目,在f上需要= true,type = void) ield「項目」在行9

私人的java.util.ArrayList Model.Channel.items類Model.Channel我已經搜索無處不在,我覺得我的實施是正確的,但我找不到錯誤,我改變了很多次我的Model類,並且使用了Web上的POJO生成器,但是我無法修復這個錯誤。請幫忙!謝謝!

回答

0

最終我改變了我的回調,它工作。我不得不使用模型類RSS回調例如:

public interface ApiService { 
    @GET("/?feed=single_gallery_feed") 
    void getGadgets(@Query("paged")int page, Callback<Rss> gadgetsCallback); 
} 

而且裏面MainActivity回調:

RestClient restClient = new RestClient(); 
     Callback callback = new Callback() { 
      @Override 
      public void success(Object o, Response response) { 
       Categories_ = (Categories)o; 
      } 

      @Override 
      public void failure(RetrofitError error) { 
       Toast toast = Toast.makeText(getApplication(), "Something went wrong!!", Toast.LENGTH_SHORT); 
       toast.show(); 
      } 
     }; 
     restClient.getApiService().getCategories(callback); 
+0

如果我想獲得'<內容:編碼>'標籤,應該怎麼我這麼做? –

+0

您應該使用名稱空間標記註釋並在命名空間內使用內容!如果變量的名稱與編碼的名稱不同,則還應該使用標記註釋名稱,該名稱與編碼的屬性相同。 – Vasilisfoo

+0

謝謝,你還可以發佈代碼剪貼。我對'Namespace'註解有點困惑。我嘗試做類似: '@Namespace(prefix =「content」) public String encoded;' 但它沒有工作。我也嘗試用'@Element(name =「encoded」'註釋,但也沒有工作,註解一個名爲'Content'的字段被稱爲'body'。 –