2010-01-11 17 views
5

Devo generare un numero di documenti XML da oggetti Java. Gli oggetti sono oggetti mappati ORM profondi e i documenti XML sono per un indice di ricerca (a la Lucene). Voglio essere in grado di creare un file di configurazione e alimentarlo con un oggetto Java e farlo sputare l'XML specificato nella configurazione. Idealmente la configurazione consisterebbe in una mappatura di proprietà (possibilmente profonde) sul lato java in XPath o qualcosa del genere sul lato XML.Che cos'è una buona libreria per generare XML arbitrario da Java?

JAXB non è adatto perché desidera creare un mapping uno a uno dai dati dell'oggetto ai nodi XML. Ho guardato JIBX e XStream ma nessuno di loro sembra progettato per fare quello di cui sto parlando.

In sostanza quello che voglio è Dozer, ma progettato per creare un documento XML come destinazione piuttosto che un altro bean Java. Dalle mie ricerche finora sembra che dovrò scrivere da solo. Qualcuno può offrire un'alternativa migliore?

MODIFICA: La soluzione non deve essere basata sulla possibilità di modificare i file Java di origine. I sistemi basati sull'annotazione sono completamente inutili ai miei scopi qui. Dovrebbe essere possibile definire "traduttori" per i singoli mapping così come sono in Dozer.

Va notato che devo essere in grado di specificare che un dato campo di input in java potrebbe essere emesso in diversi punti dell'output XML, forse in alcuni casi in alcuni casi e non in altri.

Ho già pensato di eseguire una sorta di traduzione diretta da Java a XML degli oggetti e quindi di eseguire il mio compito utilizzando XSLT, ma il problema è che si tratta di oggetti profondi con connessioni bidirezionali. Qualsiasi mappatura degli oggetti in XML avrebbe difficoltà a capire la profondità della gerarchia degli oggetti, anche se potesse tenere traccia di quali oggetti dovrebbero essere scontati perché erano già stati visti.

+0

JiBX dovrebbe essere buono per questo, perché non ti piace? – skaffman

risposta

4

Io uso questo: Simple

+0

Questo sembra essere interamente basato sull'annotazione. Voglio essere in grado di raggiungere il mio obiettivo rigorosamente attraverso un file di configurazione e potenzialmente un insieme di oggetti traduttore per formattare correttamente alcuni dati. Inoltre, non vedo alcun modo di specificare una singola proprietà di input per più campi di output. – Jherico

+0

upvoted, poiché questo ha risposto alla domanda originale. –

+0

Non così tanto. Pensavo di aver reso abbastanza evidente che * volevo * un file di configurazione. – Jherico

1

Hai guardato Castor?

In particolare, questa citazione da loro pagina web mi fa pensare che potrebbe fare quello che vuoi:

Anche se è possibile fare affidamento su comportamento predefinito di Castor al maresciallo e unmarshalling oggetti Java in un documento XML , potrebbe essere necessario avere più controllo su questo comportamento. Ad esempio, se esiste già un modello di oggetto Java, Castor XML Mapping può essere utilizzato come ponte tra il documento XML e quel modello a oggetti Java.

Castor consente di specificare alcuni dei relativi comportamento di marshalling/unmarshalling utilizzando un file di mapping. Questo file fornisce informazioni esplicite a Castor su come un determinato documento XML e un determinato insieme di oggetti Java sono in relazione tra loro.

Un'altra possibilità potrebbe essere JXM; dalla loro pagina web:

Java XML Mapping (JXM) è uno strumento per scrivere oggetti Java in XML e leggerli di nuovo. JXM fornisce un mapping predefinito in modo che gli oggetti Java che seguono le convenzioni di denominazione Java Bean possano essere scritti in XML chiamando un singolo metodo. La mappatura predefinita può essere personalizzata creando e registrando le classi di mapping con il framework JXM.

JXM si differenzia da altri strumenti di collegamento XML non richiedendo oggetti da includere o ereditare dal codice JXM. Nessun codice generato è incluso negli oggetti e non è necessario implementare interfacce JXM. La personalizzazione avviene scrivendo il codice Java piuttosto che i descrittori XML.

+0

Castor sembra essere il più vicino a quello che sto cercando di tutto ciò che ho visto. Tuttavia, la sua configurazione incentrata sulla classe mi fa chiedere se consente più mappature dello stesso campo di input a più uscite. Inoltre non vedo alcun esempio di mappatura di campi profondi. Indagherò ulteriormente però. – Jherico

0

Dai uno sguardo allo Xmappr.

Può essere configurato tramite XML esterno. È possibile avere diversi mapping che producono output diversi dallo stesso oggetto di input.

Anche noi siamo disposti ad aiutare - basta chiedere sulla mailing list.

0

Abbiamo usato Apache Velocity in passato come mezzo per mantenerlo semplice.

È sufficiente creare un modello per XML, compilare una struttura dati e iniettare la struttura dati nella mappa. Ti consente di modificare l'XML in fase di esecuzione se necessario (a condizione che la struttura dei dati contenga tutti i campi).

Questo è un modo molto veloce e flessibile per produrre un documento, non crea un DOM e quindi è piuttosto parsimonioso con la memoria.

+0

Lo svantaggio è che se si incasinano i modelli si può finire per generare XML non valido/errato in alcune circostanze. –

+0

Totalmente d'accordo. Questo non è difficile da risolvere però. È possibile aggiungere una fase di convalida separata, se lo si desidera. – Fortyrunner

0

La soluzione che si desidera è EclipseLink MOXy:

Moxy è un'implementazione JAXB con estensioni

moxy ha un file di configurazione esterno (sulla base di annotazioni JAXB con estensioni):

Ha mappatura basata XPath, per la mappatura profonda:

Progettato per gestire ORM mappato oggetti, incluso il supporto per le relazioni bidirezionali:

0

tu non specificare quali ORM si utilizza, ma se per caso è di ibernazione, si può utilizzare per fare Java < -> mappatura XML pure. La documentazione non è valida come per i mapping DB, ma non è così difficile da usare. Il grande vantaggio: hai una dipendenza in meno, una struttura in meno da imparare e i concetti che apprendi per la mappatura dei DB fino a che si applicano principalmente alla mappatura XML.

vedere: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/xml.html

Problemi correlati