Разбор xml kotlin android

У меня есть xml:

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

И теперь я изучаю kotlin whith retrofit. Я включаю библиотеки для разбора 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 } 

но у меня такая же проблема ((((

Ответ @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, не соответствующий классу Section . По умолчанию Kotlin генерирует конструктор со всеми параметрами и специальным конструктором.

Примечание. Я бы предпочел ответить в комментариях, но у меня недостаточно очков.

В самом деле, у 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 должен остаться).