如何解决org.simpleframework.xml.core.ValueRequiredException:无法满足@ org.simpleframework.xml.ElementList()

时间:2017-02-21 04:56:06

标签: android xml xml-serialization retrofit2 simple-framework

我正在尝试使用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>
  

以下是结构清晰度&lt; imagelink&gt;结构XML   文件更清晰。

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

2 个答案:

答案 0 :(得分:13)

我找到了答案。在Result.class中只需更改@ElementList()参数。这是解决方案:

错误 -

    @ElementList(name = "work", inline = true)
    public List<Work> works;

解决方案 -

    @ElementList(inline = true, required = false)
    public List<Work> works;

每当发生错误时,请记住@ElementList()

中的两件事
1- inline=true
2- required=false
example : @ElementList(inline = true, required = false)

答案 1 :(得分:0)

我也遇到过这个问题。查看文档,如下所示。

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构建器忽略标记并构建请求的剩余节点时。

P.S: 当您使用相同的类来形成XML请求以及解析响应时,这非常有用。