Purvesh Dodiya
Purvesh Dodiya

Reputation: 590

Not able to parse xml response to kotlin data class with retofit

I am trying to call the rest api which give me xml response. I am using retrofit with simplexml converter factory to parse the xml to kotlin data clas. Here is the xml response from api:

<category>
    <api-version>1.0</api-version>
    <books>
        <list>
            <result>
                <author>Hello1</author>
                <brief>Hii</brief>
            </result>
            <result>
                <author>Hello2</author>
                <brief>Hii2</brief>
            </result>
        </list>
    </books>
</category> 

and below is my kotlin data class

data class CategoryResponseModel(
        @field:Element(name = "api-version", required = false)
        @param:Element(name = "api-version", required = false)
        val apiVersion: String? = null,

        @field:Element(name = "books", required = false)
        @param:Element(name = "books", required = false)
        val books: Books? = null
)

data class Books(
        @field:Element(name = "list", required = false)
        @param:Element(name = "list", required = false)
        val list: BookList? = null
)

@Root(name = "list")
data class BookList(
        @field:Element(name = "result", required = false)
        @param:Element(name = "result", required = false)
        val result: List<BookSearchResult>? = null,
)

data class BookSearchResult(

        @field:Element(name = "author", required = false)
        @param:Element(name = "author", required = false)
        val author: String? = null,

        @field:Element(name = "brief", required = false)
        @param:Element(name = "brief", required = false)
        val briefSynopsis: String? = null,
)

But I am getting error of retrofit SimpleXML that org.simpleframework.xml.core.ElementException: Element 'result[1]/author[1]' does not have a match in class BookList

Upvotes: 7

Views: 539

Answers (1)

Purvesh Dodiya
Purvesh Dodiya

Reputation: 590

After so much findings and try and error I got the solutions.

I just did the changes in the array list element which is below block,

@Root(name = "list")
data class BookList(
        @field:ElementList(inline = true, required = false)
        @param:ElementList(inline = true, required = false)
        val result: List<BookSearchResult>? = null,
)

and complete solution code is below.

data class CategoryResponseModel(
        @field:Element(name = "api-version", required = false)
        @param:Element(name = "api-version", required = false)
        val apiVersion: String? = null,

        @field:Element(name = "books", required = false)
        @param:Element(name = "books", required = false)
        val books: Books? = null
)

data class Books(
        @field:Element(name = "list", required = false)
        @param:Element(name = "list", required = false)
        val list: BookList? = null
)

@Root(name = "list")
data class BookList(
        @field:ElementList(inline = true, required = false)
        @param:ElementList(inline = true, required = false)
        val result: List<BookSearchResult>? = null,
)

data class BookSearchResult(

        @field:Element(name = "author", required = false)
        @param:Element(name = "author", required = false)
        val author: String? = null,

        @field:Element(name = "brief", required = false)
        @param:Element(name = "brief", required = false)
        val briefSynopsis: String? = null,
)

Upvotes: 8

Related Questions