JAXB – ignorer les espaces inutiles dans les fichiers XML
JAXB permet de générer des classes Java à partir de XSD pour manipuler du XML plus facilement. En clair, il permet de générer un parseur et un générateur de flux XML en Java. Ce qui fait gagner énormément de temps en développement.
En revanche, par défaut, le parseur JAXB n’ignore pas les espaces inutiles (appelés whitespaces). Pas de panique, l’API JAXB permet de le faire assez simplement. Il faut seulement créer un filtre et l’appliquer lors de la lecture du flux XML.
Le code du filtre ressemble à ceci :
public class WhitespaceFilter implements EventFilter { public boolean accept(XMLEvent event) { return !(event.isCharacters() && ((Characters)event).isWhiteSpace()); } }
Ensuite, pour l’appliquer il suffit d’instancier votre parseur de cette façon :
JAXBContext jc = JAXBContext.newInstance("mon.package"); // instancie le parseur XML pour ignorer les espaces inutiles XMLInputFactory inputFactory = XMLInputFactory.newInstance(); XMLEventReader eventReader = inputFactory.createXMLEventReader(new FileInputStream("/monrepertoire/monfichier.xml")); eventReader = inputFactory.createFilteredReader(eventReader, new WhitespaceFilter()); // parse le fichier XML Unmarshaller u = jc.createUnmarshaller(); grid = (PCCADGRID)u.unmarshal(eventReader);
Cet exemple supprime les espaces inutiles entre les balises XML. En revanche, les espaces inutiles sont toujours présents dans les valeurs. Pour supprimer ces derniers, il faut mettre en place un adaptateur. Voici son code :
public class NormalizedStringAdapter extends XmlAdapter { public String marshal(String text) { return text.trim(); } public String unmarshal(String v) throws Exception { return v.trim(); } }
Il y a trois méthodes pour l’appliquer. Soit lors de l’initialisation du parseur :
Unmarshaller u = jc.createUnmarshaller(); u.setAdapter(new NormalizedStringAdapter());
Soit avec une annotation sur les champs concernés :
@XmlElement(required=true) @XmlJavaTypeAdapter(NormalizedStringAdapter.class) String name;
Soit avec une annotation dans les classes package-info pour l’appliquer à tous les champs du type chaine de caractère :
@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(value=NormalizedStringAdapter.class,type=String.class) package mon.package;
Une fois cet adaptateur mis en place, les données XML que vous chargerez ne seront plus polluées par des espaces, retours à la ligne, tabulations, etc…
Notez qu’il existe également un adapteur qui permet de compacter les espaces. Comme ci-dessus, il supprime les espaces en début et fin de chaine mais réduit les multiples occurrences d’espace à un seul espace. Si vous le cherchez, c’est :
javax.xml.bind.annotation.adapters.CollapsedStringAdapter
.
https://blog.lecacheur.com/2010/08/19/jaxb-ignorer-les-espaces-inutiles-dans-les-fichiers-xml/DéveloppementJava EEjava,xmlJAXB permet de générer des classes Java à partir de XSD pour manipuler du XML plus facilement. En clair, il permet de générer un parseur et un générateur de flux XML en Java. Ce qui fait gagner énormément de temps en développement. En revanche, par défaut, le parseur JAXB n'ignore...SeBSébastien LECACHEUR23r0@laposte.netAdministratorLe weblogue de SeB
Pas beaucoup de détails en comment l’utiliser avec des exemples concrets !
Sidi,
Il y a déjà tout le code, tu dois seulement créer un fichier d’exemple XML et générer automatiquement le parseur avec JAXB. Difficile de donner plus de détails sans expliquer comment utiliser JAXB. Or ce n’était pas le sujet de l’article.