2009-11-30 19 views
5

Vorrei controllare l'ordine degli attributi nei file .java generati dal compilatore JAXB.Compilatore JAXB e ordine degli attributi

Sono consapevole che l'ordine di attributo non è importante per la convalida xml. L'ordine è importante per il confronto testuale di xml marshalled in un ambiente di test di regressione. L'ordine degli attributi in un file influenza direttamente l'ordine degli attributi nei tag xml marshalled.

Ogni volta che viene eseguito il compilatore JAXB, i gruppi di attributi vengono visualizzati in un ordine diverso, anche senza modifiche allo schema. Non è disponibile alcuna opzione apparente sul compilatore per impedire questo comportamento.

Vorrei evitare di eseguire uno script di post-compilazione per riordinare in ordine alfabetico gli attributi nei file .java generati poiché questo suddivide i gruppi di attributi, ma non sono sicuro che ci sia un'altra opzione.

Qualsiasi suggerimento è molto apprezzato.

Grazie, Dave

risposta

0

Questa discussione rappresenta un'ottima soluzione al mio problema.

Using XSL to sort attributes

Una delle risposte contiene una trasformazione XSL che proprio riordina gli attributi. Funziona perfettamente se un po 'lento.

1

Mi consiglia di utilizzare un parser XML per convalidare l'uscita invece di fare i confronti testuali. Se stai per analizzare l'xml per riordinarlo comunque, puoi anche fare il confronto usando gli strumenti XML.

Modifica: Il tentativo di controllare l'XML generato manipolando l'ordine del codice sorgente Java sembra un modo fragile di fare le cose. Certo, questo è solo per test, quindi se qualcosa rompe il codice potrebbe funzionare ancora correttamente. Le persone cambiano continuamente l'ordine del codice sorgente, a volte per sbaglio, e sarà una seccatura o una sottile fonte di problemi se devi fare affidamento su un certo ordine.

Per quanto riguarda i modi di confrontare i dati XML utilizzando strumenti XML, non l'ho mai fatto personalmente su larga scala, ma this link mentions a few free tools. Per me l'estensione a JUnit che fornisce asserzioni relative a XML sarebbe il mio primo passo, in quanto potrebbe integrarsi bene con i miei test esistenti. Altrimenti, dal momento che stai principalmente cercando l'equivalenza esatta, puoi semplicemente analizzare i due file XML, quindi scorrere i nodi nel file 'previsto' e vedere se quei nodi sono presenti nel file 'effettivo'. Quindi controlla tutti gli altri nodi che non ti aspetti di vedere.

+0

Il confronto è parte di un grande test di regressione di script bash guidato e non stiamo attualmente l'analisi di qualsiasi delle risposte XML. Potrei usare uno strumento diff XML ma non ho esperienza con loro. Sto lavorando in un ambiente Solaris: puoi suggerire uno strumento diff xml che può essere richiamato dalla riga di comando per questo scopo? Anche i file da confrontare potrebbero non essere validi rispetto allo schema perché alcune differenze note sono sostituite con valori costanti. – daveg

+0

Inoltre stavo considerando di riordinare gli attributi nel file .java - non la risposta xml. Immagino che il marshaller usi la reflection perché l'ordine nel file .java sembra controllare direttamente l'ordine degli attributi nelle risposte marshalled. – daveg

+0

Ho modificato la mia risposta per indirizzare i tuoi due punti. –

1

Se è necessario eseguire il confronto testuale dei documenti XML, esistono modi migliori per farlo rispetto al tentativo di controllare l'output di un framework XML che non fa distinzione tra l'ordinamento degli attributi.

Ad esempio, c'è XMLUnit, che è un'estensione junit specifica per le asserzioni XML e gestisce gli spazi e gli ordini in modo molto gradevole.

Una soluzione più generale è XOM'sCanonicalizer, che genera DOM XML in modo che l'ordine degli attributi e lo spazio bianco siano prevedibili. Molto maneggevole.

Quindi ... lasciare che JAXB (o qualsiasi altra cosa) generi l'XML come meglio crede, quindi eseguire gli output tramite XMLUnit o XOM e confrontare. Questo ha l'ulteriore vantaggio di non dipendere da JAXB, funzionerà con qualsiasi XML generato.

4

A quanto pare, in JAXB 2.0 è possibile utilizzare il @XmlAccessorOrder annotazione o @XmlType (propOrder =)

Problemi correlati