La fusion XML simplifiée

Parfois, il semble que vous passez plus de temps à manipuler des fichiers XML qu'à écrire du code Java, il est donc logique d'avoir un ou deux réducteurs XML dans votre boîte à outils. Dans cet article, Laurent Bovet vous permet de démarrer avec XmlMerge, un outil open source qui vous permet d'utiliser des déclarations XPath pour fusionner et manipuler des données XML provenant de différentes sources.

En tant que développeur Java, vous utilisez XML tous les jours dans vos scripts de construction, descripteurs de déploiement, fichiers de configuration, fichiers de mappage objet-relationnel, etc. Créer tous ces fichiers XML peut être fastidieux, mais ce n'est pas particulièrement difficile. Manipuler ou fusionnerles données contenues dans ces fichiers disparates peuvent cependant être difficiles et prendre du temps. Vous préférerez peut-être utiliser plusieurs fichiers répartis en différents modules, mais vous vous retrouverez limité à un seul gros fichier car c'est le seul format que le consommateur visé par XML peut comprendre. Vous voudrez peut-être remplacer des éléments particuliers dans un fichier volumineux, mais vous vous retrouvez à répliquer tout le contenu du fichier à la place. Peut-être manquez-vous simplement le temps de créer les transformations XSL (XSLT) qui faciliteraient la manipulation des éléments XML dans vos documents. Quoi qu'il en soit, il semble que rien n'est jamais aussi facile qu'il devrait l'être lorsqu'il s'agit de fusionner les éléments dans vos fichiers XML.

Dans cet article, je présente un outil open source que j'ai créé pour résoudre de nombreux problèmes courants associés à la fusion et à la manipulation de données à partir de différents documents XML. EL4J XmlMerge est une bibliothèque Java sous licence LGPL qui facilite la fusion d'éléments de différentes sources XML. Bien que XmlMerge fasse partie du framework EL4J, vous pouvez l'utiliser indépendamment d'EL4J. Tout ce dont vous avez besoin pour exécuter l'utilitaire XmlMerge à partir de votre ligne de commande est JDK 1.5 ou supérieur.

Dans la discussion qui suit, vous apprendrez à utiliser XmlMerge pour une variété de scénarios de fusion XML courants, y compris la fusion de deux fichiers XML, la fusion de données de fichier XML de différentes sources pour créer un Resourcebean Spring au moment de l'exécution et la combinaison de XmlMerge et Ant pour créer un descripteur de déploiement automatisé au moment de la construction. Je vais également vous montrer comment utiliser les déclarations XPath et les actions et matchers intégrés pour spécifier le traitement d'éléments spécifiques lors d'une fusion XML. Je conclurai par un regard sur l'algorithme de fusion simple de XmlMerge et je suggérerai des moyens de l'étendre pour des opérations de fusion XML plus spécialisées.

Vous pouvez télécharger XmlMerge maintenant si vous souhaitez suivre les exemples.

Fusion de fichiers XML

Dans la liste 1, vous voyez l'exemple très courant (et grandement simplifié) de deux fichiers XML qui doivent être fusionnés.

Liste 1. Deux fichiers XML qui doivent être fusionnés

File1.xml File2.xml

Le listing 2 montre l'entrée de ligne de commande pour fusionner ces deux fichiers à l'aide de l'utilitaire XmlMerge, suivi de la sortie résultante.

Listing 2. Les deux fichiers XML fusionnés à l'aide de XmlMerge

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

Ce premier exemple de fusion est très simple, mais vous avez peut-être remarqué que l'ordre dans lequel les fichiers sont fusionnés est important. Si vous changez de commande, vous pouvez obtenir des résultats différents. (Plus loin dans l'article, vous verrez un exemple de ce qui se passe lorsque vous changez l'ordre de deux fichiers à fusionner.) Pour garder les fichiers dans l'ordre, XmlMerge utilise le terme original pour le premier document et patch pour le second. Ceci est facile à retenir car le document de patch est toujours fusionné avec l'original.

Fusion de fichiers XML de différentes sources

Vous pouvez implémenter l'utilitaire XmlMerge n'importe où dans votre code Java et l'utiliser pour fusionner des données de différentes sources dans un nouveau document utile. Dans le listing 3, je l'ai utilisé pour fusionner un fichier du système de fichiers de mon application et le contenu d'une demande de servlet dans un modèle d'objet de document unique (DOM).

Listing 3. Fusion du XML client et serveur dans un DOM

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

Création de ressources Spring Framework au moment de l'exécution

Dans certains cas, il est utile de combiner XmlMerge et Spring Framework. Par exemple, le Resourcebean Spring présenté dans le listing 4 a été créé au moment de l'exécution en fusionnant des fichiers XML séparés en un seul flux XML. Vous pouvez ensuite utiliser le Resourcebean pour configurer d'autres ressources pour le mappage objet-relationnel, la génération de documents et plus encore.

Listing 4. Un bean Spring Resource

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

Génération d'un descripteur de déploiement automatisé au moment de la construction

Vous avez probablement utilisé Ant pour automatiser vos builds. Que diriez-vous de le combiner avec XmlMerge pour générer un descripteur de déploiement XML au moment de la construction? Le listing 5 montre le XmlMergeTasktravail.

Listing 5. XmlMergeTask génère un descripteur de déploiement