0

単純な xml フレームワーク ( http://simple.sourceforge.net/ )を使用して、次の xml を実現したいと考えています。

<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 を実現するには、マッピングをどのように行う必要がありますか、または何を変更する必要がありますか?

ありがとう!

4

2 に答える 2

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 の read メソッドはreturn null、xml ファイルからオブジェクトを再構築する必要がある場合に備えて、適切に実装する必要があることに注意してください。

よろしく!

于 2010-07-09T05:38:51.523 に答える
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]
于 2016-09-03T01:03:22.730 に答える