我正在try 调用REST API,它为我提供了XML响应.我正在使用简单exml转换器工厂改进来解析从XML到Kotlin的数据类.以下是来自API的XML响应:

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

下面是我的Kotlin数据类

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,
)

但是我收到了将SimpleXML改装为org.simpleframework.xml.core.ElementException: Element 'result[1]/author[1]' does not have a match in class BookList

推荐答案

经过这么多的发现和try ,我找到了解决方案.

我只是在块下面的数组列表元素中做了更改,

@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 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,
)

Android相关问答推荐

如何禁用Android 34+版的TileService,但保留以前的版本?

在Android上使用XSLT文件转换XML文件

Jetpack编写使用自定义主题覆盖库中主题部分

Android Gradle/Groovy,如何将文件复制到APK

如何在Android Studio中将我的Java-库&库设置为Kotlin库

Jetpack Compose主导航中的全屏图标列表

无法加载类';com.android.build.api.extension.AndroidComponentsExtension';

activity在 Runnable 中如何工作?我的 Android 表格未显示

升级到 Jetpack Compose 物料 list 2023.08.00 需要我将 targetSdk 更改为 34

从 Jetpack Compose 中的图像中删除默认高度

如何将DrawableId参数传递给XML布局?

从活动共享视图模型以使用 hilt 组合函数

Jetpack 将 Grid 与基于大小的自适应列数组合在一起

java.lang.IllegalArgumentException:与请求匹配的导航目的地 NavDeepLinkRequest

Android build gradle 文件版本代码自动递增

Android - 水平(从右到左)圆形背景 colored颜色 过渡

如何在 kotlin 的 android room DB 中设置一对多关系

如何在 flow.stateIn() 之后从流中的另一个函数发出emits ?

如何将私有 mutableStateOf 分配给 Android Jetpack 中的 State 变量?

如何获取 Android Preferences DataStore 的所有键