2017-07-29 2 views
0

J'essaie de désérialiser/unmarshal XML qui contient une collection d'éléments Person enveloppés dans la balise People. J'essaye de désérialiser ce XML dans Kotlin en utilisant JAXB. Tout compile et fonctionne sans erreurs mais la collection people de ma classe est toujours vide. Comment est-ce que je démarshal cette collection?Impossible de démélanger une collection d'objets XML à l'aide de JAXB et Kotlin

import java.io.StringReader 
import javax.xml.bind.JAXB 
import javax.xml.bind.annotation.XmlAccessType 
import javax.xml.bind.annotation.XmlAccessorType 
import javax.xml.bind.annotation.XmlElement 
import javax.xml.bind.annotation.XmlElementWrapper 

@XmlAccessorType(XmlAccessType.FIELD) 
data class Person(
     var name:String = "", 
     var age:Int = 0 
) 

@XmlAccessorType(XmlAccessType.FIELD) 
data class Report(
     var statusCode:Int = 0, 
     @XmlElementWrapper(name = "people") 
     @XmlElement(name = "person") 
     var people:List<Person>? = null 
) 

val xml = """ 
<report> 
    <statusCode>3</statusCode> 
    <people> 
     <person> 
      <name>Bob</name> 
      <age>30</age> 
     </person> 
     <person> 
      <name>Alice</name> 
      <age>40</age> 
     </person> 
    </people> 
</report> 
""" 

fun main(args: Array<String>) { 
    val report = JAXB.unmarshal(StringReader(xml), Report::class.java) 
    println(report) // Report(statusCode=3, people=[]) 
} 

Répondre

4

C'est parce que vous avez défini la XmlAccessType comme FIELD, vous devez donc utiliser site target pour faire l'annotation annotée sur le support field, par exemple:

// v--- annotated on field rather than getter/setter/params 
@field:[XmlElementWrapper(name = "people") XmlElement(name = "person")] 
var people: List<Person>? = null