Gerando código Java a partir do XML no Eclipse

Eu estou trabalhando em um projeto que terá várias classes Java que são muito semelhantes entre si, e que eu gostaria de gerar a partir de arquivos XML. O que eu gostaria de poder fazer é alterar o processo de compilação do Eclipse para fazer algo assim:

Compile o gerador de códigoExecute o gerador de código, convertendo o XML para JavaCompile o resto do projeto

Eu poderia fazer isso tudo manualmente, mas eu preferiria poder fazer o Eclipse fazer tudo para mim.

Exemplo

Eu quero ser capaz de tomar um arquivo XML de origem que se parece com isso:

<command-list>
    <command name="DATE" />
    <command name="GROUP">
        <capability "READER" />
        <argument "groupname" />
    </command>
    <command name="ARTICLE">
        <capability "READER" />
        <argument "message-id" optional="true" />
    </command>
</command-list>

e me dê algo semelhante ao seguinte (em arquivos separados, conforme apropriado):

public class Date extends Command {
    public ResponseCode execute() {
        Server srv = getServer();
        srv.send("DATE");
        return srv.getResponse();
    }
}

public class Group extends Command {
    public ResponseCode execute() {
        Server srv = getServer();
        if (srv.hasCapability(Capabilities.READER) == false) {
            Log.debug("Attempting non-available capability: READER");
        }
        String groupname = getArgument("groupname");
        if (groupname == null) {
             throw new InvalidArgumentException("Require groupname");
        }
        String command = "GROUP";
        if (groupname != null) command += " " + groupname;
        srv.send(command);
        return srv.getResponse();
    }
}

public class Article extends Command {
    public ResponseCode execute() {
        Server srv = getServer();
        if (srv.hasCapability(Capabilities.READER) == false) {
            Log.debug("Attempting non-available capability: READER");
        }
        String messageId = getArgument("messageId");
        String command = "ARTICLE";
        if (messageId != null) command += " " + messageId;
        srv.send(command);
        return srv.getResponse();
    }
}

questionAnswers(2)

yourAnswerToTheQuestion