2016-11-08 95 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必須保留)。