Estou usando Retrofit e Jackson com parser XML para transformar esse XML em classes de dados. Como você pode ver, é um array muito raro dentro de child_group... há um item e uma info, um item e uma info, etc... não é um array normal.
<?xml version="1.0" encoding="utf-8"?>
<parent id="2261">
<child_group>
<item>
<line>1</line>
</item>
<info></info>
<item>
<line>2</line>
</item>
<info></info>
<item>
<line>3</line>
</item>
<info></info>
</child_group>
</parent>
Não consigo encontrar nenhuma informação sobre como criar a estrutura de classe de dados para analisar isso. O que posso tentar em seguida?
Esta estrutura de classe de dados passada para retrofit analisa apenas o primeiro item e a primeira informação, mas não o restante deles:
@JacksonXmlRootElement(localName = "parent")
data class Parent(
val id: String,
@JacksonXmlElementWrapper(useWrapping = false)
@JacksonXmlProperty(localName = "child_group")
val child_group: ChildGroup
)
data class ChildGroup(
@JacksonXmlElementWrapper(useWrapping = false)
@JacksonXmlProperty(localName = "item")
val item: List<Item>,
val info: String? = null
)
data class Item(
val line: String
)
Este é meu construtor Retrofit:
Retrofit.Builder().baseUrl("https://www.website.es/")
.addConverterFactory(
JacksonConverterFactory.create(XmlMapper()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.registerKotlinModule()))
.build().create(ApiService::class.java)
Eu tentei fazer isso também, com o mesmo resultado:
@JacksonXmlRootElement(localName = "parent")
data class Parent(
val id: String,
@JacksonXmlProperty(localName = "child_group")
@JacksonXmlElementWrapper(useWrapping = false)
val childGroup: List<ChildGroupItem>
)
data class ChildGroupItem(
val item: Item,
val info: String? = null
)
data class Item(
val line: String
)
Este problema é semelhante a https://stackoverflow.com/a/79388160/860227 . Se você conseguir classificar todos os itens em
child_group
(todasitem
as tags vêm primeiro, seguidas porinfo
), sua solução funcionará.Você precisa criar um desserializador personalizado para a classe ChildGroup como:
e registrá-lo na classe de dados: