2011-09-06 5 views
1

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.

+2

Je pense que l'instance xml, devrait être ' test' par xsd et pas comme celui que vous mentionnez – Cratylus

+0

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

+0

@seedhead - Vous avez défini l'élément 'Works' comme étant de type' Work', pour ne pas contenir l'élément 'Work'. –

Répondre

2

Vous pourriez avoir un schéma XML comme:

<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:Works"></element> 

    <complexType name="Works"> 
     <sequence> 
      <element name="Work" type="tns:Work" maxOccurs="unbounded"/> 
     </sequence> 
    </complexType> 

    <complexType name="Work"> 
     <sequence> 
      <element name="Composer" type="tns:Composer" maxOccurs="unbounded"/> 
     </sequence> 
    </complexType> 


    <complexType name="Composer"> 
     <sequence> 
      <element name="Name" type="string"/> 
     </sequence> 
    </complexType> 

</schema> 

qui correspond au code XML suivant:

<Works xmlns="http://www.example.org/test/"> 
    <Work> 
     <Composer> 
      <Name>Test Name</Name> 
     </Composer> 
    </Work> 
</Works> 
+0

dans votre exemple de schéma ci-dessus, ne devrait-il pas être pas ? – seedhead

+0

@seedhead - Vous avez raison, j'ai apporté la modification au schéma XML. –

+0

Merci. J'ai essayé votre xsd et maintenant je reçois ce problème quand unmarshalling: javax.xml.bind.UnmarshalException: élément inattendu (uri: "http://www.example.org/test/", local: "Works"). Les éléments attendus sont (aucun) – seedhead