2016-11-08 98 views
0

我有这样的XML:解析XML科特林安卓

<horo> 
<aries> 
<today> 
Сегодня вас могут здорово огорчить. Если от расстройства все начнет валится из рук, просто спокойно сядьте и тихонько подождите хорошей новости. 
</today> 
</aries> 
<taurus> 
<today> 
Сегодня у вас могут возникнуть проблемы на личном фронте. Спасти вас от перспективы оказаться не у дел может сухой, рациональный и в высшей степени объективный подход к проблеме. 
</today> 
</taurus> 
</horo> 

,现在我学习科特林蒙山改造。我包括用于解析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: Default constructor can not accept read only @org.simpleframework.xml.Element(data=false, name=aries, required=true, type=void) on method 'aries' in class ac.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 
} 

,但我有同样的问题((((

回答

3

@daementus的答案几乎完美。如果您想使用构造函数注入使用默认参数,你必须强制科特林生成构造函数重载:

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 = "" 
) 

没有它,你会得到构造类部分不匹配。 默认情况下,Kotlin生成一个包含所有参数和特殊构造函数的构造函数。

注意:我宁愿在评论中回答,但我没有足够的分数。

+0

适用于没有'@ JvmOverloads'注释的我。 –

5

事实上,简单的XML框架有几个问题科特林属性,它可以是一个有点棘手得到的东西的工作。

说实话,我不太清楚你的具体情况是什么问题,但我猜测不应该为getter指定注释,而应该为该字段指定注释。

无论如何,我结合简单的XML和科特林数据类这种方式,它似乎是做工精细:)

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必须保留)。