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 :

Erreur xml UTF-8


Sujet :

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

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 298
    Points : 85
    Points
    85
    Par défaut Erreur xml UTF-8
    Bonjour,
    je génère un flux xml en mémoire, puis je le transforme en pdf via un xsl,
    dès que les données xml contiennet des données avec des valeurs avec des accents par exmple j'ai l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SEVERE: javax.xml.transform.TransformerException: java.io.UTFDataFormatException: Invalid byte 2 of 3-byte UTF-8 sequence.
    j'ai essayé dans mon fichier xsl de changer l'encoding qui était :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?xml version="1.0" encoding="ISO-8859-1"?>
    à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?xml version="1.0" encoding="UTF-8"?>
    mais ça résout toujours pas le problème.

    merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 90
    Points : 80
    Points
    80
    Par défaut
    cette exception vient du fait que ton fichier XML utilise l'encodage UTF-8, alors que tu essaye de le lire en utilisant le "system default encoding" (qui n'est pas UTF )
    alors si ton fichier contient des caractères non ASCII, le programme ne les reconnait pas et génère l'exception

    solution:
    tu dois avoir quelque chose qui ressemble à ça dans ton code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    InputStream is = new ByteArrayInputStream(xmlDataBuffer.toString()
                    .getBytes());
    BufferedInputStream bfStream = new BufferedInputStream(is);
    la solution c'est de forcer la lecture des caractère UTF seulement
    xmlDataBuffer.toString().getBytes("UTF-8")

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 298
    Points : 85
    Points
    85
    Par défaut Code de génération XML
    dans mon fichier XSL j'ai changé le encoding à :

    dans mon code j'ai la méthode de génération XML comme suivant:
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    public static boolean generatePDF(HttpServletResponse response, Object dataToSerialize, XStream xstream, String xslFilePath,String xmlFilePath) {
     
    		logger.info("begin generatePDF");
     
    		//TODO delete later :DEBUG : affiche dans System.out le résultat de la sérialisation
    		xstream.toXML(dataToSerialize, System.out);
    		boolean success = true;
     
    		try {
     
    			File xmlfile = new File(xmlFilePath);
     
    			//File xsltfile = new File(xslFilePath);
    			FileOutputStream fos = new FileOutputStream(xmlfile);
     
    			// DEBUG : affiche dans System.out le résultat de la sérialisation
    			xstream.toXML(dataToSerialize,fos);
     
    			logger.info("DEBUG 1111111111111");
     
     
     
    			logger.info("DEBUG 22222222222222");		
    			// read xsl file into xslInputStream
    			File xslFile = new File(xslFilePath);
    			InputStream xslInputStream = new FileInputStream(xslFile);
     
     
    			// create output stream
    			ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
     
     
    			logger.info("DEBUG 444444444444");
     
    			// create pdf driver
    			Driver driver = new Driver();
    			driver.setLogger(new ConsoleLogger(ConsoleLogger.LEVEL_INFO));
    			driver.setRenderer(Driver.RENDER_PDF);
    			driver.setOutputStream(outputStream);
     
    			logger.info("DEBUG 5555555555555");
     
    			// encapsulate objects...
    			//Source xml = new StreamSource(xmlInputStream);
    			Source xsl = new StreamSource(xslInputStream);
    		//	Result res = new SAXResult(driver.getContentHandler());
     
    //			 Setup input for XSLT transformation
    			Source src = new StreamSource(xmlfile);
     
    			// Resulting SAX events (the generated FO) must be piped through to
    			// FOP
    			Result res = new SAXResult(driver.getContentHandler());
    			try {
    				logger.info("DEBUG 6666666666666");
    				// transform xml with xsl
    				Transformer transformer = TransformerFactory.newInstance().newTransformer(xsl);
    				transformer.setParameter("versionParam", "2.0");
     
    				// Start XSLT transformation and FOP processing
    				transformer.transform(src, res);
    				logger.info("DEBUG 6.1");
    				// set response with transformed data
    				response.setContentType("application/pdf");
    				response.setHeader("Content-Disposition", "attachment; filename=contrats.pdf");
     
    				logger.info("DEBUG 6.2");
     
    				response.setContentLength(outputStream.size());
    				response.getOutputStream().write(outputStream.toByteArray());
     
    				logger.info("DEBUG 6.3");
     
    				response.getOutputStream().flush();
    				response.getOutputStream().close();
    			}
    			finally {
    				logger.info("DEBUG 77777777777");
    				//xmlInputStream.close();
    				xslInputStream.close();
    				outputStream.close();
    			}
     
    		}
    		catch (Exception e) {
    			success = false;
    			logger.severe(e.toString());
    		}
     
    		logger.info("end generatePDF");
    		return success;
    	}
    ou définir l'encoding??

    mercii

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 90
    Points : 80
    Points
    80
    Par défaut
    dsl je peux pas me synchroniser avec ton code, moi je le fait au moment du la création de mon InputStream.

    essaye de le faire ainsi (j'ai pas testé le code )


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                   File xslFile = new File(xslFilePath);
                   InputStream xslInputStream = new ByteArrayInputStream(xslFile.toString().getBytes("UTF-8"));
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    		logger.info("DEBUG 22222222222222");		
    		// read xsl file into xslInputStream
    		File xslFile = new File(xslFilePath);
    		InputStream xslInputStream = new FileInputStream(xslFile);

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 298
    Points : 85
    Points
    85
    Par défaut Exception TransformerConfigurationException
    en remplaçant dans mon code juste la ligne que ta indiqué :
    j'ai l'erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SEVERE: javax.xml.transform.TransformerConfigurationException: javax.xml.transform.TransformerConfigurationException: javax.xml.transform.TransformerException: org.xml.sax.SAXParseException: Content is not allowed in prolog.
    à moins qu'il faut adapter le code après


  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 90
    Points : 80
    Points
    80
    Par défaut
    oui
    bon peut être le code n'est pas très bien écrit, mais le principe est correct : il faut indiquer à ton InputStream de lire du UTF-8

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 298
    Points : 85
    Points
    85
    Par défaut la méthode globale
    bon juste pour rapeler meme si j'ai déjà donné la méthode: là ou j'essaie de configurer avec le UTF-8

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    public static boolean generatePDF(HttpServletResponse response, Object dataToSerialize, XStream xstream, String xslFilePath,String xmlFilePath) {
     
    		logger.info("begin generatePDF");
     
    		//TODO delete later :DEBUG : affiche dans System.out le résultat de la sérialisation
    		xstream.toXML(dataToSerialize, System.out);
    		boolean success = true;
     
    		try {
     
    			File xmlfile = new File(xmlFilePath);
     
    			//File xsltfile = new File(xslFilePath);
    			FileOutputStream fos = new FileOutputStream(xmlfile);
     
    			// DEBUG : affiche dans System.out le résultat de la sérialisation
    			xstream.toXML(dataToSerialize,fos);
     
    			logger.info("DEBUG 1111111111111");
     
     
     
    			logger.info("DEBUG 22222222222222");		
    			// read xsl file into xslInputStream
    			File xslFile = new File(xslFilePath);
     
    			InputStream xslInputStream = new FileInputStream(xslFile);
    			//TODO to test to reslove caractères problem
    			//InputStream xslInputStream = new ByteArrayInputStream(xslFile.toString().getBytes("UTF-8"));
     
    			// create output stream
    			ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
     
     
    			logger.info("DEBUG 444444444444");
     
    			// create pdf driver
    			Driver driver = new Driver();
    			driver.setLogger(new ConsoleLogger(ConsoleLogger.LEVEL_INFO));
    			driver.setRenderer(Driver.RENDER_PDF);
    			driver.setOutputStream(outputStream);
     
    			logger.info("DEBUG 5555555555555");
     
    			// encapsulate objects...
    			//Source xml = new StreamSource(xmlInputStream);
    			Source xsl = new StreamSource(xslInputStream);
    		//	Result res = new SAXResult(driver.getContentHandler());
     
    //			 Setup input for XSLT transformation
    			Source src = new StreamSource(xmlfile);
     
    			// Resulting SAX events (the generated FO) must be piped through to
    			// FOP
    			Result res = new SAXResult(driver.getContentHandler());
    			try {
    				logger.info("DEBUG 6666666666666");
    				// transform xml with xsl
    				Transformer transformer = TransformerFactory.newInstance().newTransformer(xsl);
    				transformer.setParameter("versionParam", "2.0");
     
    				// Start XSLT transformation and FOP processing
    				transformer.transform(src, res);
    				logger.info("DEBUG 6.1");
    				// set response with transformed data
    				response.setContentType("application/pdf");
    				response.setHeader("Content-Disposition", "attachment; filename=contrats.pdf");
     
    				logger.info("DEBUG 6.2");
     
    				response.setContentLength(outputStream.size());
    				response.getOutputStream().write(outputStream.toByteArray());
     
    				logger.info("DEBUG 6.3");
     
    				response.getOutputStream().flush();
    				response.getOutputStream().close();
    			}
    			finally {
    				logger.info("DEBUG 77777777777");
    				//xmlInputStream.close();
    				xslInputStream.close();
    				outputStream.close();
    			}
     
    		}
    		catch (Exception e) {
    			success = false;
    			logger.severe(e.toString());
    		}
     
    		logger.info("end generatePDF");
    		return success;
    	}

Discussions similaires

  1. [XSLT] Erreur XML généré par php "semble pas avoir d'information de style"
    Par Overstone dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 01/08/2007, 18h59
  2. [AJAX] XAJAX : message d'erreur XML
    Par Rick62 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/04/2007, 11h38
  3. erreur xml insertBefore
    Par totoche dans le forum ASP
    Réponses: 1
    Dernier message: 30/10/2006, 17h08
  4. parsing xml utf-8
    Par zizou771 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 15/09/2006, 00h32
  5. [XML] Php -> XML / Utf-8
    Par gehan dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 09/02/2006, 10h30

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