解析xml kotlin android
我有这样的XML:
<horo> <aries> <today> Сегодня вас могут здорово огорчить. Если от расстройства все начнет валится из рук, просто спокойно сядьте и тихонько подождите хорошей новости. </today> </aries> <taurus> <today> Сегодня у вас могут возникнуть проблемы на личном фронте. Спасти вас от перспективы оказаться не у дел может сухой, рациональный и в высшей степени объективный подход к проблеме. </today> </taurus> </horo>
现在我正在学习kotlin whith翻新。 我包括解析XML的库,而不是我不能理解如何创建对象来解析这个XML。 我有对象:
@Root(name = "horo", strict = false) open class DailyHoroscope{ @get : Element(name = "aries") var aries : Aries? = null } @Root(name = "aries", strict = false) open class Aries{ @get : Element(name = "today") var today : String? = null }
但我有错误:
rg.simpleframework.xml.core.ConstructorException:默认的构造函数不能接受只读类org.simpleframework.xml.Element(data = false,name = aries,required = true,type = void) .kotlintest.model。
UPD
我在java中编写代码:
@Root(name = "horo", strict = false) public class DailyHoroscopeJ { @Element(name = "aries") public Aries aries; public Aries getAries() { return aries; } public void setAries(Aries aries) { this.aries = aries; } } @Root(name = "aries", strict = false) class Aries{ @Element(name = "today") public String today; public String getToday() { return today; } public void setToday(String today) { this.today = today; } }
它工作正常,然后我转换到KOTLIN
@Root(name = "horo", strict = false) class DailyHoroscope { @get:Element(name = "aries") var aries:Aries? = null } @Root(name = "aries", strict = false) class Aries { @get:Element(name = "today") var today:String? = null }
但我有同样的问题((((
@daementus的答案几乎是完美的。 如果你想使用默认参数构造函数注入,你必须强制Kotlin生成构造函数重载:
data class Section @JvmOverloads constructor( @field:Element(name = "id") @param:Element(name = "id") val id: Long, @field:Attribute(name = "title", required = false) @param:Attribute(name = "title", required = false) val title: String = "" )
没有它,你会得到Constructor不匹配类部分 。 默认情况下,Kotlin生成一个包含所有参数和特殊构造函数的构造函数。
注意:我宁愿在评论中回答,但我没有足够的分数。
事实上,简单的XML框架在Kotlin属性方面有一些问题,让事情发挥作用可能有点棘手。
说实话,我不太清楚在你的具体情况下是什么问题,但我猜测不应该为getter指定注释,而应该为field指定注释。
无论如何,我这样结合Simple XML和Kotlin数据类,它似乎工作正常:)
data class Section ( @field:Element(name = "id", required = false) @param:Element(name = "id", required = false) val id: Long? = null, @field:Attribute(name = "title", required = false) @param:Attribute(name = "title", required = false) val title: String? = null )
编辑:如果你不想使用数据类(我强烈建议,但你可能有一个原因),这应该工作,没有“数据”关键字就好了。 如果你不想创建一个构造函数,只需将属性声明直接移入类中,并抛弃@param注释(@field必须保留)。