Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Ok scusami, cerco di essere più chiaro, mi conviene anche forse scendere più nel dettaglio.
Sto adoperando JAXB, in particolare da terminale il comando
<code>
xjc file.xsd
</code>
per creare delle classi Java che mi permettano di inizializzare un oggetto che contiene i dati dell'xml relativo all' xsd dato in pasto al terminale.
Ciò che vorrei fare è creare un programma che ricevendo in input i file .xsd e .xml riesca a generare le classi che generavo con il comando
<code>
xjc file.xsd
</xsd>
e creare un programma che contenga tali classi e che una volta ricevuto il file xml sia in grado dunque di creare l'oggetto.
Lo so è un casino...![]()
Ora è già più chiaro .... ma resta (almeno a me) il dubbio di capire perché hai bisogno di una tale "generalizzazione". Cioè, in genere se si sviluppa una applicazione che richiede mapping tra classi e XML, si deve sapere a priori quali tipi di XML trattare, si generano (o scrivono a mano) a priori i file che "modellano" gli XML, poi si compila il tutto e .... basta.
Quindi o tu stai cercando di fare un qualche tool molto generico (il cui senso/utilizzo mi sfugge ...) oppure non ha granché senso.
Ultima modifica di andbin; 14-10-2013 a 15:23
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Perchè per i progetti universitari che mi capitano è scocciante ogni volta dover perdere 3 minuti per importare le classi e cambiare i dati nel main.
Mi piacerebbe automatizzare il tutto, diciamo che sono un tipo maniacalmente preciso![]()
Oppure, riduco il campo della domanda:
"Come faccio per generare le classi a partire dall'XSD direttamente da un programma Java piuttosto che dal terminale?"
Ma fare quello che hai chiesto richiederebbe molto di più che 3 minuti e molto, molto più codice rispetto a cambiare poi solo poche cose nei tuoi progetti!!
Immagino che nei tuoi progetti tu debba trattare ogni volta XML differenti (come struttura intendo) e allora, tanto, in ogni caso devi generare appositamente dei sorgenti Java dai xsd. E se invece in più progetti hai la stessa tipologia di XML, allora la soluzione è creare un progetto-libreria comune.
Quello che invece si potrebbe fare (e avrebbe anche più senso) è utilizzare un processo di build con Ant o Maven (con Ant è sicuramente fattibile, con Maven dovrei documentarmi) tale per cui una volta impostato il progetto e il/i file di build, esso vada a (ri)generare se necessario i file .java dai file .xsd durante la fase di build.
E la problematica sarebbe solamente più "impostare il progetto" e se riesci ad ottenere una struttura che puoi riutilizzare velocemente da un progetto all'altro, ancora meglio.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Si questo è vero, ma lo faccio una sola volta e poi andrà bene per sempre.
Quindi potrebbe convenirmi vista la quantità di volte che faccio quella operazione.
Mi conviene sicuramente nel momento in cui adopero questa cosa come esercizio.
Ad ogni modo, ho risolto facendo in questo modo:
Codice PHP:import com.sun.codemodel.*;
import com.sun.tools.xjc.api.*;
import org.xml.sax.InputSource;
// Configure sources & output
String schemaPath = "path/to/schema.xsd";
String outputDirectory = "schema/output/source/";
// Setup schema compiler
SchemaCompiler sc = XJC.createSchemaCompiler();
sc.forcePackageName("com.xyz.schema.generated");
// Setup SAX InputSource
File schemaFile = new File(schemaPath);
InputSource is = new InputSource(new FileInputStream(schemaFile));
// Parse & build
sc.parseSchema(is);
S2JJAXBModel model = sc.bind();
JCodeModel jCodeModel = model.generateCode(null, null);
jCodeModel.build(new File(outputDirectory));
Ok, non sapevo (beh, potevo immaginarlo ma non ho mai cercato/guardato...) che c'è una API per usare programmaticamente XJC. Quello che hai postato è comunque solo il "succo" ... ovviamente manca il contorno.
Ma ad ogni modo l'unica cosa che ottieni è un bel insieme di sorgenti ... che devi poi compilare.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet