Kotlin 1.2.21 + SimpleXml 2.3.0 – 消耗List错误(必须标记set get方法)
我正在尝试通过Retrofit 2使用SimpleXML来使用XML。经过几个小时与Kotlin的斗争,我决定尝试Java版本然后转换到Kotlin。 Java版本运行良好……
错误:
java.lang.RuntimeException: org.simpleframework.xml.core.MethodException: Annotation @org.simpleframework.xml.ElementList(data=false, empty=true, entry=, inline=true, name=entry, required=true, type=void) must mark a set or get method
我需要一个能够使用该XML的Kotlin模型类。 这是输入:
someid somedate someid2 somedate2
Java模型类版本(工作正常):
@Root(name = "feed", strict = false) public class MFeed { @ElementList(name = "entry", inline = true) private List entriesList; public MFeed(List entriesList) { this.entriesList = entriesList; } public MFeed() { } public List getEntriesList() { return entriesList; } public void setEntriesList(List entriesList) { this.entriesList = entriesList; } } @Root(name = "entry", strict = false) public class MEntry { @Element(name = "id") private String id; @Element(name = "published") private String published; public MEntry() { } public MEntry(String id, String published) { this.id = id; this.published = published; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getPublished() { return published; } public void setPublished(String published) { this.published = published; } }
和自动生成的Kotlin模型看起来像这样:
@Root(name = "feed", strict = false) class Feed { @ElementList(name = "entry", inline = true) private var entriesList: List? = null //autogenerated by converter java -> kotlin constructor(entriesList: List) { this.entriesList = entriesList } //autogenerated by converter java -> kotlin constructor() {} } @Root(name = "entry", strict = false) class Entry { @Element(name = "id") var id: String? = null @Element(name = "published") var published: String? = null //autogenerated by converter java -> kotlin constructor() {} //autogenerated by converter java -> kotlin constructor(id: String, published: String) { this.id = id this.published = published } }
我已经为使用XML列表做了很多工作,包括这个post, 这个和这个 。 没有用。 也许它们已经过时了。 有人遇到这样的问题吗
尝试将@field
添加到注释@Element*
。 您可以将属性移动到构造函数,也可以向类中添加data
修饰符。 喜欢这个:
@Root(name = "feed", strict = false) data class Feed( @field:ElementList(name = "entry", inline = true) var entriesList: List? = null ) @Root(name = "entry", strict = true) data class Entry( @field:Element(name = "id") var id: String? = null, @field:Element(name = "published") var published: String? = null )
有了这个我成功地反序列化xml:
import org.simpleframework.xml.Element import org.simpleframework.xml.ElementList import org.simpleframework.xml.Root import org.simpleframework.xml.core.Persister private val testXml = """ someid somedate someid2 somedate2 """.trimIndent() @Root(name = "feed", strict = false) data class Feed( @field:ElementList(name = "entry", inline = true) var entriesList: List? = null ) @Root(name = "entry", strict = true) data class Entry( @field:Element(name = "id") var id: String? = null, @field:Element(name = "published") var published: String? = null ) fun main(args: Array) { println(testXml) val serializer = Persister() val example = serializer.read(Feed::class.java, testXml) println(example) }