5

私はこのようなxmlを持っています:

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

そして今、私はレトロフィットでkotlinを学んでいます。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: デフォルトのコンストラクターは、クラス ac のメソッド 'aries' で読み取り専用の @org.simpleframework.xml.Element(data=false, name=aries, required=true, type=void) を受け入れることができません.kotlintest.モデル。

更新

私は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
}

しかし、私は同じ問題を抱えています((((

4

2 に答える 2

12

実際、Simple XML Framework には Kotlin 属性に関するいくつかの問題があり、機能させるのは少し難しい場合があります。

正直なところ、特定のケースで何が問題なのかよくわかりませんが、注釈はゲッターではなくフィールドに指定する必要があると思います。

とにかく、私はシンプルな 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 はそのままにしておく必要があります)。

于 2016-11-11T16:05:37.740 に答える