La fusione XML resa semplice

A volte sembra che passi più tempo a manipolare file XML che a scrivere codice Java, quindi ha senso avere uno o due wrangler XML nella tua cassetta degli attrezzi. In questo articolo, Laurent Bovet ti fa iniziare con XmlMerge, uno strumento open source che ti consente di utilizzare le dichiarazioni XPath per unire e manipolare dati XML da diverse fonti.

In qualità di sviluppatore Java, utilizzi XML ogni giorno negli script di compilazione, nei descrittori di distribuzione, nei file di configurazione, nei file di mappatura relazionale degli oggetti e altro ancora. Creare tutti questi file XML può essere noioso, ma non è particolarmente impegnativo. Manipolazione o fusionei dati contenuti in file così disparati, tuttavia, possono essere difficili e richiedere molto tempo. Potresti preferire utilizzare diversi file suddivisi in moduli diversi, ma ti ritroverai limitato a un file di grandi dimensioni perché questo è l'unico formato che il consumatore previsto di XML può comprendere. Potresti voler sovrascrivere elementi particolari in un file di grandi dimensioni, ma ti ritrovi invece a replicare l'intero contenuto del file. Forse ti manca solo il tempo per creare le trasformazioni XSL (XSLT) che renderebbero più semplice la manipolazione degli elementi XML nei tuoi documenti. In ogni caso, sembra che nulla sia mai così facile come dovrebbe essere quando si tratta di unire gli elementi nei file XML.

In questo articolo, presento uno strumento open source che ho creato per risolvere molti dei problemi comuni associati all'unione e alla manipolazione di dati da diversi documenti XML. EL4J XmlMerge è una libreria Java con licenza LGPL che semplifica l'unione di elementi da diverse origini XML. Sebbene XmlMerge faccia parte del framework EL4J, puoi usarlo indipendentemente da EL4J. Tutto ciò di cui hai bisogno per eseguire l'utilità XmlMerge dalla riga di comando è JDK 1.5 o superiore.

Nella discussione che segue, imparerai come utilizzare XmlMerge per una varietà di scenari comuni di unione XML, tra cui l'unione di due file XML, l'unione di dati di file XML da diverse fonti per creare un Resourcebean Spring in fase di runtime e la combinazione di XmlMerge e Ant per creare un descrittore di distribuzione automatizzato in fase di compilazione. Ti mostrerò anche come utilizzare le dichiarazioni XPath e le azioni incorporate e i matcher per specificare il trattamento di elementi specifici durante un'unione XML. Concluderò con uno sguardo al semplice algoritmo di unione di XmlMerge e suggerirò i modi in cui potrebbe essere esteso per operazioni di unione XML più specializzate.

Puoi scaricare XmlMerge ora se vuoi seguire gli esempi.

Unione di file XML

Nel Listato 1 si vede l'esempio molto comune (e notevolmente semplificato) di due file XML che devono essere uniti.

Listato 1. Due file XML che devono essere uniti

File1.xml File2.xml

Il Listato 2 mostra l'input della riga di comando per unire questi due file utilizzando l'utilità XmlMerge, seguito dall'output risultante.

Listato 2. I due file XML sono stati uniti utilizzando XmlMerge

~ $ java -jar xmlmerge-full.jar file1.xml file2.xml         ~ $

Questo primo esempio di unione è molto semplice, ma potresti aver notato che l'ordine in cui vengono uniti i file è importante. Se cambi l'ordine, puoi ottenere risultati diversi. (Più avanti nell'articolo vedrai un esempio di cosa succede quando cambi l'ordine di due file da unire.) Per mantenere i file in ordine, XmlMerge usa il termine originale per il primo documento e la patch per il secondo. Questo è facile da ricordare perché il documento patch è sempre unito all'originale.

Unione di file XML da diverse origini

È possibile implementare l'utilità XmlMerge ovunque nel codice Java e utilizzarla per unire i dati da diverse origini in un nuovo documento utile. Nel Listato 3, l'ho usato per unire un file dal filesystem della mia applicazione e il contenuto di una richiesta servlet in un unico Document Object Model (DOM).

Listato 3. Unione di client e server XML in un DOM

XmlMerge xmlMerge = new DefaultXmlMerge(); org.w3c.dom.Document doc = documentBuilder.parse( xmlMerge.merge( new FileInputStream("file1.xml"), servletRequest.getInputStream()));

Creazione di risorse Spring Framework in fase di esecuzione

In alcuni casi è utile combinare XmlMerge e Spring Framework. Ad esempio, il Resourcebean Spring mostrato nel Listato 4 è stato creato in fase di runtime unendo file XML separati in un unico flusso XML. È quindi possibile utilizzare il Resourcebean per configurare altre risorse per la mappatura relazionale degli oggetti, la generazione di documenti e altro.

Listato 4. Un bean Spring Resource

     ch/elca/el4j/tests/xmlmerge/r1.xml     ch/elca/el4j/tests/xmlmerge/r2.xml            

Generazione di un descrittore di distribuzione automatizzato in fase di compilazione

Probabilmente hai usato Ant per automatizzare le tue build. Che ne dici di combinarlo con XmlMerge per generare un descrittore di distribuzione XML in fase di compilazione? Il listato 5 mostra il XmlMergeTasklavoro.

Listato 5. XmlMergeTask genera un descrittore di distribuzione