RSS Feed

Archive de August, 2010

Android Software – un an déjà !

23 August 2010 par SeB 6 commentaires »

Ça fait un moment que je dois écrire cette note pour vous parler du site Android Software. C’est un site qui présente de nombreuses applications pour Android. Les fiches sont en français. Attention, ce ne sont pas des tests des applications puisque certaines fiches sont des “copier/coller” des présentations des éditeurs. Néanmoins, le site a le mérite de faire connaitre toutes ces applications. Et il en présente énormément.

Je tiens d’ailleurs à remercier Lorand, l’administrateur du site, d’avoir mis gracieusement pendant quelques temps une bannière de publicité pour MonBonCoin. Merci aussi d’avoir fait connaitre certaines de mes autres applications pour Android sans que je lui en parle.

Pour finir, Android Software fêtait sa première année d’existence la semaine dernière. Pour l’occasion, Lorand avait organisé des concours. Ce week-end j’ai eu l’agréable surprise d’apprendre que j’étais l’heureux gagnant d’une licence CoPilot Live. Cool ! Pour être franc, je visais le téléphone Acer Stream. Non pas que je n’ai plus de téléphone mais pour faire des tests pour mes applications sur d’autres modèles que le HTC Hero. :-) Mais je ne vais pas me plaindre. Une licence pour ce logiciel de navigation est un très beau lot ! ;-)

Bon anniversaire à Android Software ! Je souhaite encore un bravo et mes encouragements à Lorand pour tout ce qu’il fait pour nous, les utilisateurs francophone d’Android.

 

JAXB – ignorer les espaces inutiles dans les fichiers XML

19 August 2010 par SeB 2 commentaires »

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 supprimer 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.