Gestion du texte contenu dans les balises xml
Gestion(Formatage/Validation) du texte contenu dans les balises xml
Transformer les caractères spéciaux du contenu des balises xml généré avec JAXB en Entités HTML ou en Caractère ASCII.
JAXB permet de générer des fichiers xml à partir d’Objets Java ; les fichiers ainsi généré peuvent traités par un autre système d’information avec des paramètres d’encodage diffèrent du système d’origine ce qui pourrais avoir des conséquences sur l’encodage des caractères spéciaux.
Dans ce tutoriel, nous allons voir les choses suivantes :
- Transformation d’un objet java en flux xml
- Réécriture des caractères spéciaux dans les balises
Technologies utilisées dans cet article
- JDK 1.8
- JAXB 2.2.2
- Dépendances Maven
Pour JAXB, pas besoin de dépendance, la JDK contient tout le nécessaire dans le fichier « rt.jar » ; il nous faut donc qu’une dépendance à ajouter dans le « pom.xml »
<dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.2.2</version></dependency>
- Création de l’Objet à transformer en Xml.
Nous devons utiliser les annotations JAXB pour la création de l’Objet.
package com.prefix.exemple;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement;@XmlRootElementpublic class Auteur { private String nom; private String prenom; private String age; /** * @return the nom. */ public String getNom() { return nom; } /** * @param nom nom to set. */ @XmlElement public void setNom(String nom) { this.nom = nom; } /** * @return the prenom. */ public String getPrenom() { return prenom; } /** * @param prenom prenom to set. */ @XmlElement public void setPrenom(String prenom) { this.prenom = prenom; } /** * @return the age. */ public String getAge() { return age; } /** * @param age age to set. */ @XmlElement public void setAge(String age) { this.age = age; }}
- Transformer notre objet en xml (avec le préfix par defaut)
package com.prefix.exemple; import javax.xml.bind.JAXBContext;import javax.xml.bind.JAXBException;import javax.xml.bind.Marshaller;public class Main { /** * @param args * @throws JAXBException */ public static void main(String[] args) throws JAXBException { Auteur p = new Auteur(); p.setNom("L'alpha"); p.setPrenom("Mémé Màmouna"); p.setAge("31"); JAXBContext jaxbContext = JAXBContext.newInstance(Personne.class); Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); jaxbMarshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); jaxbMarshaller.marshal(p, System.out); }}
- Sortie Standard
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><auteur> <age>31</age> <nom>L'alpha </nom> <prenom> Mémé Màmouna </prenom></auteur>
- Réécriture des caractères
Pour la gestion des caractères, JAXB utilise l’Objet « com.sun.xml.bind.marshaller.CharacterEscapeHandler » nous allons implémenter cet Objet :
- implémentation et réécriture de l’Objet
package com.prefix.exemple;import java.io.IOException;import java.io.StringWriter;import java.io.Writer;import com.sun.xml.bind.marshaller.CharacterEscapeHandler;public class XmlCharacterHandler implements CharacterEscapeHandler { /** * */ public void escape(char[] buf, int start, int len, boolean isAttValue, Writer out) throws IOException { StringWriter buffer = new StringWriter(); for (int i = start; i < start + len; i++) { buffer.write(buf[i]); } String st = buffer.toString(); if (!st.contains("CDATA")) { // supprumer les "/" avant les "&" st = buffer.toString() .replace("&", "\\&") .replace("<", "\\<") .replace(">", "\\>") .replace("'", "\\'") .replace("\\"", "\\"") .replace("é", "\\é") .replace("à", "\\à"); } out.write(st); }}
- Prise en compte du changement
package com.prefix.exemple;import javax.xml.bind.JAXBContext;import javax.xml.bind.JAXBException;import javax.xml.bind.Marshaller;import com.sun.xml.bind.marshaller.CharacterEscapeHandler;public class Main { /** * @param args * @throws JAXBException */ public static void main(String[] args) throws JAXBException { Auteur p = new Auteur(); p.setNom("L'alpha"); p.setPrenom("Mémé Màmouna"); p.setAge("31"); JAXBContext jaxbContext = JAXBContext.newInstance(Auteur.class); Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); jaxbMarshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); jaxbMarshaller.setProperty(CharacterEscapeHandler.class.getName(), new XmlCharacterHandler()); jaxbMarshaller.marshal(p, System.out); }}
- Sortie Standard
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><auteur> <age>31</age> <nom>Mam's</nom> <prenom>Néné Màmouna</prenom></auteur>