Retrofitを使用してURLから本のxmlデータを取得しようとしています。ただし、アプリを実行するとエラーが表示されます。私は新しいので助けてください。エラーメッセージは次のとおりです。
02-20 23:06:37.943 23835-23835/com.santossingh.reader E/error:
org.simpleframework.xml.core.ValueRequiredException: Unable to satisfy @org.simpleframework.xml.ElementList(data=false, empty=true, entry=, inline=true, name=work, required=true, type=void) on field 'works' public Java.util.List com.santossingh.reader.AWS.GoodReadsModels.Results.works for class com.santossingh.reader.AWS.GoodReadsModels.Results at line 2
XMLファイルの構造と私のモデルとクラスは次のとおりです。
1- URL XMLファイルの構造:
<?xml version="1.0" encoding="UTF-8"?>
<GoodreadsResponse>
<Request>
<authentication>true</authentication>
<key><![CDATA[xxxxx]]></key>
<method><![CDATA[search_index]]></method>
</Request>
<search>
<query><![CDATA[business]]></query>
<results-start>1</results-start>
<results-end>20</results-end>
<total-results>109755</total-results>
<source>Goodreads</source>
<query-time-seconds>0.22</query-time-seconds>
<results>
<work>
<id type="integer">17624817</id>
<books_count type="integer">85</books_count>
<ratings_count type="integer">156992</ratings_count>
<text_reviews_count type="integer">8489</text_reviews_count>
<original_publication_year type="integer">2011</original_publication_year>
<original_publication_month type="integer" nil="true"/>
<original_publication_day type="integer" nil="true"/>
<average_rating>4.01</average_rating>
<best_book type="Book">
<id type="integer">12609433</id>
<title>The Power of Habit: Why We Do What We Do in Life and Business</title>
<author>
<id type="integer">5201530</id>
<name>Charles Duhigg</name>
</author>
<image_url>https://images.gr-assets.com/books/1366758683m/12609433.jpg</image_url>
<small_image_url>https://images.gr-assets.com/books/1366758683s/12609433.jpg</small_image_url>
</best_book>
</work>
<results>
より明確にするために、構造XMLファイルの構造< imagelink >を明確にします。
2-Results.classのモデル:
@Root (name = "results", strict = false)
public class Results {
@ElementList (name = "work", inline = true)
public List<Work> works;
public Results() {
}
public Results(List<Work> works) {
this.works = works;
}
public List<Work> getWorks() {
return works;
}
public void setWorks(List<Work> works) {
this.works = works;
}
}
2- Work.classのモデル:
@Root(name = "work", strict = false)
public class Work {
@Path("best_book")
@Element(name = "id")
private int id;
@Path("best_book")
@Element (name = "title")
private String title;
@Path("best_book/author")
@Element(name = "name")
private String author;
@Path("best_book")
@Element (name = "image_url")
private String image;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
}
私は答えを見つけました。 Result.classで、@ ElementList()パラメーターを変更するだけです。解決策は次のとおりです。
エラー-
@ElementList(name = "work", inline = true)
public List<Work> works;
解決 -
@ElementList(inline = true, required = false)
public List<Work> works;
そのエラーが発生したときはいつでも、@ ElementList()で2つのことを覚えておいてください
1- inline=true
2- required=false
example : @ElementList(inline = true, required = false)
私もこの問題に直面しました。ドキュメントを見ると、以下のようになっています。
The ValueRequiredException is thrown when an attribute or element is missing from the XML document. This is thrown only if the attribute or element is required according to the annotation for that field within the XML schema class.
基本的に、これは、形成されたリクエストとXMLリクエストスキーマの間に不一致がある場合に発生します。
したがって、注釈を使用します
@ElementList(name="XMLNode", required = false)
public <<DataType>> XMLNode;
いつ required = false
ビルダーはタグを無視し、リクエストの残りのノードをビルドします。
追伸:これは主に、同じクラスを使用してXMLリクエストを作成し、レスポンスを解析する場合に役立ちます。