J'utilise JAXB et ne peux pas comprendre pourquoi mes objets imbriqués ne sont pas unmarshalled. Je génère les classes via la commande XJC. Par exemple, lorsque je unmarshall l'objet Works, la collection Composers contient toujours une instance Composer sera un nom NULL.Unmarshalling des objets imbriqués en utilisant JAXB
Mon XML ressemble à ceci:
<Works>
<Work>
<Composer>
<Name>Test Name</Name>
</Composer>
</Work>
</Works>
et XSD est comme ceci:
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
jxb:version="2.0" xmlns:tns="http://www.example.org/test/"
targetNamespace="http://www.example.org/test/">
<element name="Works" type="tns:Work"></element>
<complexType name="Work">
<sequence>
<element name="Composers" type="tns:Composer" maxOccurs="unbounded"
minOccurs="1">
</element>
</sequence>
</complexType>
<complexType name="Composer">
<sequence>
<element name="Name" type="string">
</element>
</sequence>
</complexType>
Et mon code qui fait le unmarshalling:
JAXBContext jc = JAXBContext.newInstance("mypackagename");
Unmarshaller um = jc.createUnmarshaller();
Works works = (Works)um.unmarshal(new FileReader("src/main/resources/works.xml"));
Work work = works.getWorks().get(0);
Composer composer = work.getComposers().get(0);
System.out.println(composer.getName());
Nom est toujours NULL, même si je sais que cela a une valeur.
Je pense que l'instance xml, devrait être ' test ' par xsd et pas comme celui que vous mentionnez –
Cratylus
Désolé, légère faute de frappe de ma part, quand je récupère le compositeur ce serait work.getComposers() pas works.getCompose r() - J'ai modifié le code. – seedhead
@seedhead - Vous avez défini l'élément 'Works' comme étant de type' Work', pour ne pas contenir l'élément 'Work'. –