2010-06-08 4 views
0

Je veux obtenir le code XML suivant en utilisant le framework simple xml (http://simple.sourceforge.net/):Comment faire pour mapper une classe abstraite avec un XML simple en Java?

<events> 
    <course-added date="01/01/2010"> 
     ... 
    </course-added> 
    <course-removed date="01/02/2010"> 
     .... 
    </course-removed> 
    <student-enrolled date="01/02/2010"> 
     ... 
    </student-enrolled> 
</events> 

je les suivantes (mais il ne parvient pas xml désiré):

@Root(name="events") 
class XMLEvents { 

    @ElementList(inline=true) 
    ArrayList<XMLEvent> events = Lists.newArrayList(); 

     ... 
} 


abstract class XMLEvent { 

    @Attribute(name="date") 
    String dateOfEventFormatted; 

    ... 

} 

Et autre type de XMLNodes qui ont des informations différentes (mais sont tous différents types d'événements)

@Root(name="course-added") 
class XMLCourseAdded extends XMLEvent{ 

    @Element(name="course") 
    XMLCourseLongFormat course; 

    .... 
} 

@Root(name="course-removed") 
class XMLCourseRemoved extends XMLEvent { 

    @Element(name="course-id") 
    String courseId; 

     ... 

} 

Comment dois-je faire la cartographie ou wh au cas où je devrais changer afin d'être en mesure d'atteindre xml souhaité?

Merci!

+0

Je ne comprends pas votre question. Voulez-vous savoir si votre exemple est correct? Ou voulez-vous que le code remplisse vos objets Java en fonction de ce code XML? Aussi, voulez-vous dire "simple XML" comme dans XML simple, ou une bibliothèque SimpleXML? – Pops

Répondre

0

Une façon très propre pour résoudre le problème est de créer votre propre convertisseur tel que:

public class XMLEventsConverter implements Converter<XMLEvents> { 

    private Serializer serializer; 

    XMLEventsConverter(Serializer serializer){ 
     this.serializer = serializer; 
    } 

    @Override 
    public XMLEvents read(InputNode arg0) throws Exception { 
     return null; 
    } 

    @Override 
    public void write(OutputNode node, XMLEvents xmlEvents) throws Exception { 
     for (XMLEvent event : xmlEvents.events) { 
      serializer.write(event, node); 
     } 
    } 

} 

Et puis utilisez un RegistryStrategy et lier les XMLEvents de classe avec le convertisseur précédent:

private final Registry registry = new Registry(); 
private final Serializer serializer = new Persister(new RegistryStrategy(registry)); 
.... 
registry.bind(XMLEvents.class, new XMLEventsConverter(serializer)); 

De cette manière, le xml obtenu est celui désiré. Notez que la méthode de lecture sur le XMLEventsConverter seulement return null, au cas où vous avez besoin de reconstruire l'objet à partir du fichier XML, vous devez l'implémenter correctement.

Cordialement!

0

On dirait que vous pouvez le faire en utilisant maintenant la fonctionnalité @ElementListUnion

import org.simpleframework.xml.Attribute; 
import org.simpleframework.xml.ElementList; 
import org.simpleframework.xml.ElementListUnion; 
import org.simpleframework.xml.core.Persister; 

import java.io.StringReader; 
import java.util.List; 

/** 
* Created by dan on 3/09/16. 
*/ 
public class XMLEventsTest { 

    public static final String XML_EVENTS = "<?xml version=\"1.0\" " + 
     "encoding=\"ISO-8859-1\"?><events>" + 
     "<course-added date=\"2016/10/1\"/>" + 
     "<course-removed date=\"2016/10/2\"/>" + 
     "</events>"; 

    public static void main(String args[]) throws Exception { 
    Persister persister = new Persister(); 
    XMLEvents events = persister.read(XMLEvents.class, new StringReader(XML_EVENTS)); 

    for (XMLEvent e : events.events) { 
     System.out.println("found event: " + e); 
    } 
    } 

    public static class XMLEvents { 
    @ElementListUnion({ 
     @ElementList(entry = "course-added", type = XMLCourseAdded.class, inline = true), 
     @ElementList(entry = "course-removed", type = XMLCourseRemoved.class, inline = true), 
    }) 
    private List<XMLEvent> events; 
    } 

    public static class XMLEvent { 
    @Attribute(name = "date") 
    private String dateOfEventFormatted; 

    public String getDateOfEventFormatted() { 
     return dateOfEventFormatted; 
    } 

    @Override 
    public String toString() { 
     return getClass().getSimpleName() + "[" + dateOfEventFormatted + "]"; 
    } 
    } 

    public static class XMLCourseAdded extends XMLEvent { 
    } 

    public static class XMLCourseRemoved extends XMLEvent { 
    } 


} 

Cette imprimera:

found event: XMLCourseAdded[2016/10/1] 
found event: XMLCourseRemoved[2016/10/2] 
Questions connexes