IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

Caractères chinois dans fichier XML


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 18
    Points : 10
    Points
    10
    Par défaut Caractères chinois dans fichier XML
    Bonsoir,

    Mon problème est le suivant :

    Je génère un fichier xml qui peut contenir des caractères chinois que je dois transformer en document hml via une xsl.

    J'utilise la librairie DOM4J mais au moment de la transformation xsl, j'ai cette exception :

    net.sf.saxon.trans.XPathException: Illegal HTML character: decimal 151

    J'ai bien essayé de changer l'encoding du fichier xml mais je ne trouve pas la solution.

    Pouvez-vous m'aider ?

    Merci

  2. #2
    Membre à l'essai
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Novembre 2010
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    L'erreur peut provenir de beaucoup de raisons differentes, as tu le fichier XSD correspondant à ton fichier xml ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Tu ne veux pas dire XSL ?

    Je n'ai pas de fichier XSD, je ne valide pas mon fichier XML, il est temporaire pour ensuite le transformer en HTML via une feuille XSL.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Il y a sûrement confusion dans les charsets, mais où, c'est bien le problème.

    Il faudrait faire un tout petit exemple qui illustre le problème, et nous montrer cet exemple, en entier. Avec le code qui génère le XML temporaire, et la XSL employée.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Voilà plus de détails :

    En-tête fichier XML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <?xml version="1.0" encoding="UTF-8"?>
    Portion en chinois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <note>
    TEST 6: ��好
    TEST 5: ��好
    TEST 2: ��好
    TEST 4: ��好
    TEST 3: ��好
    TEST 1: ��好
    TEST 7: ��好
    </note>
    En-tête fichier XSL (transformation en HTML)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="html" />
    Portion générant l''exception (en voulante lire le noeud note plus haut)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <td>
    	<pre>
    		<xsl:value-of select="note"/>
    	</pre>
    </td>
    Ecriture du fichier xml sur le disque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    FileOutputStream fos = new FileOutputStream(file);
    OutputFormat format = new OutputFormat("\t", true);
    XMLWriter writer = new XMLWriter(fos, format);
    writer.write(document);
    writer.flush();
    writer.close();
    Transformation XSL : (API native Java) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    Source source = this.xmlSource;
    public void transform(LinkedList<File> xslFiles, Map<String, Object> args) throws FatalException {
    	Source source = this.xmlSource;
    	for (File xslFile : xslFiles) {
    	    this.charArrayWriter = new CharArrayWriter();
    	    Result result = new StreamResult(this.charArrayWriter);
    	    Source xslSource = new StreamSource(xslFile);
    	    try {
    		Transformer transformer = TransformerFactoryImpl.newInstance().newTransformer(xslSource);
    		for (Entry<String, Object> entry : args.entrySet())
    		    transformer.setParameter(entry.getKey(), args.get(entry.getKey()));
    		transformer.transform(source, result);
    	    } catch (TransformerException e) {
    		throw new FatalException(e);
    	    }
    	    Reader reader = new CharArrayReader(this.charArrayWriter.toCharArray());
    	    source = new StreamSource(reader);
    	}
    }
    Remarque : j'ai déjà ajouté un encoding dans l'objet OutputFormat dont utf-8 mais ça ne fonctionne pas

    Merci de votre aide

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    J'ai dit un tout petit exemple, oui, mais complet. Je copie les fichiers dans mon Eclipse, je clique sur run et je vois ce qui se passe.

    Avec ce qu'on voit là, j'accuserais probablement la construction de this.xmlSource
    Mais bon, c'est juste l'hypothèse la plus probable.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par thelvin Voir le message
    J'ai dit un tout petit exemple, oui, mais complet. Je copie les fichiers dans mon Eclipse, je clique sur run et je vois ce qui se passe.

    Avec ce qu'on voit là, j'accuserais probablement la construction de this.xmlSource
    Mais bon, c'est juste l'hypothèse la plus probable.
    C'est difficile de simplifier mais l'objet xmlSource est instancié avec le fichier xml comme paramètre.

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Simplifie quand même. Je ne le disais pas pour blaguer.

    Je me doute bien que xmlSource est construit à partir d'un fichier XML et pas d'un ris de veau, ce qui compte c'est comment.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Je vais essayer de préparer ça.

    En attendant, je pense que le problème se situe à l'écriture du fichier xml.

    Voici le code pour écrire le fichier via un Document dom4j

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    FileOutputStream fos = new FileOutputStream(file);
    	    OutputFormat format = OutputFormat.createPrettyPrint();
    	    format.setEncoding("UTF-8");
    	    format.setTrimText(false);
    	    XMLWriter writer = new XMLWriter(fos, format);
    	    writer.write(document);
    	    writer.flush();
    	    writer.close();
    	    fos.close();
    Quand je mets l'encoding "GBK", ça passe mais les caractères chinois sont remplacés par "?"

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Voilà ce que je peux vous fournir afin de tester la transformation :

    Fichier file.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?xml version="1.0" encoding="UTF-8"?>
    <history>
    	<note>早晨好</note>
    </history>
    Fichier test.xsl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="html" encoding="UTF-8" />
    	<xsl:template match="/">
    		<html>
    			<body>
    				<xsl:apply-templates select="history"/>
    			</body>
    		</html>
    	</xsl:template>
    	<xsl:template match="history">
    		<p><xsl:value-of select="note" /></p>
    	</xsl:template>
    </xsl:stylesheet>
    Classe de transformation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    public class XsltTransformerForTest {
     
        protected Source xmlSource;
        protected CharArrayWriter charArrayWriter;
     
        public XsltTransformerForTest(Source xmlSource) {
    	this.xmlSource = xmlSource;
        }
     
        public XsltTransformerForTest(File xmlFile) {
    	this(new StreamSource(xmlFile));
        }
     
        public Source getXmlSource() {
    	return this.xmlSource;
        }
     
        public void setXmlSource(Source xmlSource) {
    	this.xmlSource = xmlSource;
        }
     
        public char[] getCharArray() {
    	return this.charArrayWriter.toCharArray();
        }
     
        public void transform(File xslFile, Map<String, Object> args) throws SocomecException {
    	LinkedList<File> xslFiles = new LinkedList<File>();
    	xslFiles.add(xslFile);
    	transform(xslFiles, args);
        }
     
        public void transform(LinkedList<File> xslFiles, Map<String, Object> args) {
    	Source source = this.xmlSource;
    	for (File xslFile : xslFiles) {
    	    this.charArrayWriter = new CharArrayWriter();
    	    Result result = new StreamResult(this.charArrayWriter);
    	    Source xslSource = new StreamSource(xslFile);
    	    try {
    		Transformer transformer = TransformerFactoryImpl.newInstance().newTransformer(xslSource);
    		for (Entry<String, Object> entry : args.entrySet())
    		    transformer.setParameter(entry.getKey(), args.get(entry.getKey()));
    		transformer.transform(source, result);
    	    } catch (Exception e) {
    		e.printStackTrace();
    	    }
    	    Reader reader = new CharArrayReader(this.charArrayWriter.toCharArray());
    	    source = new StreamSource(reader);
    	}
        }
     
    }

    Et une classe Run pour executer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    public class Run {
     
        /**
         * @param args
         * @throws HubException
         * @throws TransformerFactoryConfigurationError
         * @throws TransformerConfigurationException
         */
        public static void main(String[] args) {
    	File xslFile = new File("test.xsl");
    	File xmlHistoric = new File("file.xml");
    	XsltTransformerForTest xsltTransformerForTest = new XsltTransformerForTest(xmlHistoric);
    	try {
    	    xsltTransformerForTest.transform(xslFile, new HashMap<String, Object>());
    	} catch (Exception e) {
    	    e.printStackTrace();
    	}
        }
    }
    Merci de votre aide

  11. #11
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Ton fichier XML ne contient pas de chinois mais du gribouilli.

    Il nous faut les choses telles qu'elles sont, si tu veux qu'on regarde. Personnellement j'en ai marre de te dire de quoi on a besoin pour t'aider.
    Je regarderai peut-être plus tard s'il y a un indice dans ce que tu daignes montrer, mais là j'ai juste pas envie.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Ton fichier XML ne contient pas de chinois mais du gribouilli.

    Il nous faut les choses telles qu'elles sont, si tu veux qu'on regarde. Personnellement j'en ai marre de te dire de quoi on a besoin pour t'aider.
    Je regarderai peut-être plus tard s'il y a un indice dans ce que tu daignes montrer, mais là j'ai juste pas envie.
    Le problème est là, je récupère ces données d'une base de données et dans la base c'est ainsi.

    Je n'ai pas la main sur les données.

Discussions similaires

  1. [Batch] Remplacer chaine de caractère dans fichier xml
    Par meumeu73.1 dans le forum Scripts/Batch
    Réponses: 0
    Dernier message: 27/09/2011, 08h36
  2. Caractères spéciaux dans fichier XML
    Par Kembali dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 02/02/2011, 10h35
  3. Caractère parasite dans fichier XML avec XMLEncoder
    Par TOPGUN89 dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 08/07/2010, 10h09
  4. PBM Ecriture caractère spécial dans fichier XML
    Par Le Grand Habchkleu dans le forum VBScript
    Réponses: 1
    Dernier message: 14/09/2009, 11h14
  5. [Débutant]Caractères chinois dans un fichier.
    Par angearael dans le forum Langage
    Réponses: 5
    Dernier message: 04/01/2007, 13h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo