解析 XML 的 Kotlin Android

6

I have xml like this:

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

现在我正在学习使用Retrofit的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.kotlintest.model 类的 aries 方法中,使用只读的 @org.simpleframework.xml.Element(data=false, name=aries, required=true, type=void) 时,无法接受默认构造函数。

更新

我写的是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
}

但是我有同样的问题((((
2个回答

22

@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 not matched for class Section错误。默认情况下,Kotlin会生成包含所有参数和一个特殊构造函数的构造函数。

注意:我更喜欢在评论中回答,但我没有足够的积分。


2
没有 @JvmOverloads 注解也可以在我的电脑上运行。 - Rahul Chowdhury
@RahulChowdhury 你可能没有设置默认参数。 - Arun Yogeshwaran

14

确实,Simple XML Framework在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
)

编辑:如果您不想使用数据类(虽然我强烈建议使用,但您可能有原因),那么这应该可以正常工作,而无需使用“data”关键字。如果您不希望创建构造函数,只需将属性声明直接移入类中并且去掉@param注释即可(@field必须保留)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接