Как я должен сопоставить абстрактный класс с простым XML в Java? - PullRequest
0 голосов
/ 08 июня 2010

Я хочу получить следующий XML с использованием простой XML-фреймворка (http://simple.sourceforge.net/):

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

    ...

}

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

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 сентября 2016

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

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

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 является желаемым.Обратите внимание, что метод read в XMLEventsConverter просто return null, на случай, если вам нужно перестроить объект из XML-файла, вы должны правильно его реализовать.

С уважением!

...