2010-06-08 1 views
0

Я хочу, чтобы достичь следующего XML, используя простую структуру XML (http://simple.sourceforge.net/):Как сопоставить абстрактный класс с простым xml в 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> 

У меня есть следующие (но не достичь желаемого XML):

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

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

     ... 
} 


abstract class XMLEvent { 

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

    ... 

} 

И другой тип из XMLNodes, которые имеют различную информацию (но все разные типы событий)

@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; 

     ... 

} 

Как я должен сделать отображение или ВГ когда я должен измениться, чтобы получить желаемый xml?

Спасибо!

+0

Я не понимаю вашего вопроса. Вы хотите знать, правильно ли ваш пример? Или вы хотите, чтобы код заполнял ваши объекты Java на основе этого XML? Кроме того, вы имеете в виду «простой XML», как в несложном XML, или в библиотеке SimpleXML? – Pops

ответ

0

Очень чистый способ решения этой проблемы является создать свой собственный конвертер, таких как:

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); 
     } 
    } 

} 

И затем использовать RegistryStrategy и связать XMLEvents класса с предыдущим преобразователем:

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

Таким образом, полученный xml является желаемым. Обратите внимание, что метод чтения на XMLEventsConverter равен return null, если вам нужно перестроить объект из XML-файла, вы должны его правильно реализовать.

С уважением!

0

Похоже, вы можете сделать это сейчас, используя функциональные возможности @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 { 
    } 


} 

Это напечатает:

found event: XMLCourseAdded[2016/10/1] 
found event: XMLCourseRemoved[2016/10/2] 
Смежные вопросы