Generando código Java desde XML en Eclipse

Estoy trabajando en un proyecto que tendrá varias clases de Java que son muy similares entre sí, y que me gustaría generar desde archivos XML. Lo que me gustaría poder hacer es cambiar el proceso de compilación de Eclipse para hacer algo como esto:

Compilar el generador de código.Ejecuta el generador de código, convirtiendo el XML a Java.Compila el resto del proyecto.

Podría hacer todo esto manualmente, pero preferiría que Eclipse lo haga todo por mí.

Ejemplo

Quiero poder tomar un archivo XML de origen que tenga este aspecto:

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

y que me dé algo similar a lo siguiente (en archivos separados, según corresponda):

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

Respuestas a la pregunta(2)

Su respuesta a la pregunta