【问题标题】:Parsing xml kotlin android解析xml kotlin android
【发布时间】:2017-03-22 03:22:02
【问题描述】:

我有这样的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:默认构造函数 不能接受只读@org.simpleframework.xml.Element(data=false, name=aries, required=true, type=void) 在类中的方法“aries”上 ac.kotlintest.model.

更新

我用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
}

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

【问题讨论】:

    标签: java android xml kotlin kotlin-android-extensions


    【解决方案1】:

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

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

    注意:我更愿意在 cmets 中回答,但我没有足够的分数。

    【讨论】:

    • 在没有 @JvmOverloads 注释的情况下为我工作。
    • @RahulChowdhury 你可能没有默认参数
    【解决方案2】:

    确实,Simple XML Framework 在 Kotlin 属性方面存在一些问题,而且要让事情正常工作可能有点棘手。

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

    无论如何,我正在以这种方式组合 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 必须保留)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-15
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 2013-11-06
      • 2012-05-21
      • 2018-08-12
      • 1970-01-01
      相关资源
      最近更新 更多