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