当前位置: 首页 > 知识库问答 >
问题:

在kotlin中使用SimpleXML序列化改造xml响应

蒋泰
2023-03-14

我正在尝试使用SimpleXML将改装xml响应序列化到一个对象中。

但是出现以下例外情况:

org.simpleframework.xml.core.值必需异常:无法满足@org.simpleframework.xml.ElementList(data=false,空=true,入口=,内联=true,名称=ALLFile,必需=true,类型=无效)字段'file"

响应示例:

<LIST> 
   <ALLFile>
      <File>
         <NAME>SOME FILE NAME</NAME>
         <FPATH>SOME FILE PATH</FPATH>
         <SIZE>160053622</SIZE>
         <TIMECODE>1299673239</TIMECODE>
         <TIME>2018/11/23 14:04:46</TIME>
         <ATTR>33</ATTR>
      </File>
   </ALLFile>
   <ALLFile> 
      <File> 
	 <NAME>SOME FILE NAME</NAME>
         <FPATH>SOME FILE PATH</FPATH>
         <SIZE>160053622</SIZE>
         <TIMECODE>1299673559</TIMECODE>
         <TIME>2018/11/23 14:14:46</TIME>
         <ATTR>33</ATTR>
      </File>
   </ALLFile>
</LIST>

对象:

@Root(name = "LIST", strict = false)
data class ListResponse @JvmOverloads constructor(
    @field:ElementList(name = "ALLFile", inline = true) var files: List<GetVideosResponse>? = null
)

@Root(strict = false, name = "File")
data class GetVideosResponse @JvmOverloads constructor(
    @field:Element(name = "NAME", required = false) var name: String? = null,
    @field:Element(name = "FPATH", required = false) var fPath: String? = null,
    @field:Element(name = "SIZE", required = false) var size: Int? = null,
    @field:Element(name = "TIMECODE", required = false) var timeCode: Long? = null,
    @field:Element(name = "TIME", required = false) var time: String? = null,
    @field:Element(name = "ATTR", required = false) var attr: Int? = null)

我收到来自服务器的200响应,因此可以排除我的请求逻辑问题。这让我相信问题在于序列化对象,有什么想法吗?

共有1个答案

贺俊楚
2023-03-14

找到了解决这个问题的方法,不一定是答案,但对我来说很有效。。。

我将XML响应作为字符串,将其转换为JSON,然后使用我常用的JSON序列化库(moshi)将JSON序列化为对象。

private fun parseXmlToJsonObject(xml: String) : String {
    var jsonObj: JSONObject? = null
    try {
        jsonObj = XML.toJSONObject(xml)
    } catch (e: JSONException) {
        Log.e("JSON exception", e.message)
        e.printStackTrace()
    }

    return jsonObj.toString()
}

fun<T> parseResponse(xml: String, clazz: Class<T>) : T {
    try {
        return initializeMoshi().adapter(clazz).fromJson(parseXmlToJsonObject(xml))!!
    }catch (e: IOException){
        throw IllegalArgumentException("Could not deserialize: $xml into class: $clazz")
    }
}

private fun initializeMoshi(): Moshi {
    return Moshi.Builder()
        .add(KotlinJsonAdapterFactory())
        .build()
}

并这样称呼它:

val myObject = parseResponse(response.body()!!.string(), MyJsonClass::class.java)
 类似资料:
  • 我正在尝试使用kotlin中的simplexml解析rss提要。 该订阅源是itunes的顶级播客订阅源 返回的数据具有以下结构: 我关心的部分是条目标签包含的播客列表。 我的模型类如下所示: 我有一个简单的单元测试,从文件中加载xml,将其传递给简单的exml反序列化器,然后将输出与一些预期的模型进行比较。 当我运行测试时,我得到一个异常: 向@ElementList注释中添加必需=false会

  • 问题内容: 我正在尝试从此graphml创建节点和边缘对象。我有一些很棒的建议,告诉我在进一步研究中使用多个软件包,因为这是我用于simplexml的android实现。 http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#nested 我从节点开始。我已经创建了节点类: 在我的mainActivity中,

  • 我使用改造2.7.1与静态编程语言协程。 我的改装服务定义如下: 此调用返回HTTP 204无内容响应,这会导致改装时崩溃: 如何使用协程处理改造中的204响应而不崩溃?

  • 我正在努力把这个改型班翻译成科特林。它基本上是一个作为客户机工作的单例,我不确定我的Kotlin实现。UserAPI和ProfileAPI只是接口。 这是我的Kotlin实现。正如我所理解的,当类实例化时,init块将首先执行。 但有些事情告诉我,这不是正确的方法,或者可以做得更好。这里有什么我可以改进的吗? 更新!!! 可以吗?

  • 我试图使用SimpleXML序列化HealthCase类的对象。我能够正确地序列化所有内容,除了测试对象的ArrayList和每个测试对象拥有的图像对象的ArrayList。所有类的每个字段都有适当的访问器和突变器方法,但是当我尝试序列化时,会抛出各种xml复合写入错误,并且不会写入相关的XML文件。 HealthCase类(不包括方法): 测试类别(不包括方法): 图像类(不包括方法): 我应该

  • 问题内容: 如何使用simpleXML在xml文件中编辑值? 我知道如何创建文件,但不知道如何编辑现有文件中的值? 问题答案: 确保可以使用SimpleXML进行编辑: 看一下例子。