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 :

xml: caractères invalides


Sujet :

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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Par défaut xml: caractères invalides
    Bonjour,

    Dans une application, je crée un document XML (org.w3c.dom.Document).

    Un utilisateur de mon application a rentré une chaîne de caractère qui comprenait une apostrophe encodée "bizarrement". Le résultat est que je ne pouvais plus sérialiser ou transformer le document par après (-> Exception). J'avais une exception :

    Caused by: java.lang.RuntimeException: Document XML : problème d'entrée/sortie
    at be.uclouvain.doctorats.utils.xml.XmlDocument.serialize(XmlDocument.java:64)
    at be.uclouvain.doctorats.utils.print.PrintXml.serialize(PrintXml.java:91)
    at be.uclouvain.doctorats.action.PrintAction.doAction(PrintAction.java:66)
    ... 22 more
    Caused by: java.io.IOException: The character '' is an invalid XML character
    at com.sun.org.apache.xml.internal.serialize.BaseMarkupSerializer.fatalError(BaseMarkupSerializer.java:1873)
    at com.sun.org.apache.xml.internal.serialize.BaseMarkupSerializer.surrogates(BaseMarkupSerializer.java:1542)
    at com.sun.org.apache.xml.internal.serialize.XMLSerializer.printText(XMLSerializer.java:1334)
    at com.sun.org.apache.xml.internal.serialize.BaseMarkupSerializer.characters(BaseMarkupSerializer.java:1383)
    at com.sun.org.apache.xml.internal.serialize.BaseMarkupSerializer.serializeNode(BaseMarkupSerializer.java:1059)
    at com.sun.org.apache.xml.internal.serialize.XMLSerializer.serializeElement(XMLSerializer.java:1089)
    at com.sun.org.apache.xml.internal.serialize.BaseMarkupSerializer.serializeNode(BaseMarkupSerializer.java:1209)
    at com.sun.org.apache.xml.internal.serialize.XMLSerializer.serializeElement(XMLSerializer.java:1089)
    at com.sun.org.apache.xml.internal.serialize.BaseMarkupSerializer.serializeNode(BaseMarkupSerializer.java:1209)
    at com.sun.org.apache.xml.internal.serialize.XMLSerializer.serializeElement(XMLSerializer.java:1089)
    at com.sun.org.apache.xml.internal.serialize.BaseMarkupSerializer.serializeNode(BaseMarkupSerializer.java:1209)
    at com.sun.org.apache.xml.internal.serialize.XMLSerializer.serializeElement(XMLSerializer.java:1089)
    at com.sun.org.apache.xml.internal.serialize.BaseMarkupSerializer.serializeNode(BaseMarkupSerializer.java:1209)
    at com.sun.org.apache.xml.internal.serialize.XMLSerializer.serializeElement(XMLSerializer.java:1089)
    at com.sun.org.apache.xml.internal.serialize.BaseMarkupSerializer.serializeNode(BaseMarkupSerializer.java:1209)
    at com.sun.org.apache.xml.internal.serialize.BaseMarkupSerializer.serializeNode(BaseMarkupSerializer.java:1277)
    at com.sun.org.apache.xml.internal.serialize.BaseMarkupSerializer.serialize(BaseMarkupSerializer.java:489)
    at be.uclouvain.doctorats.utils.xml.XmlDocument.serialize(XmlDocument.java:61)
    ... 24 more
    Ce que je peux dire, c'est que c'est ce code qui introduisait le texte problématique :

    document.createTextNode(text);

    J'aurais pensé que createTextNode() devrait s'occuper de transformer n'importe quelle chaîne valide pour qu'elle puisse être mise dans le XML ???

    Pour info, tout dans mon application est en UTF-8, sauf la db (latin-1), gérée par un autre département. Mais jusqu'ici, je ne pense pas avoir de problème de conversion (si ce n'est qu'on ne peut pas tout convertir).

    Je suis inquiet, car je sais que le problème risque de se reproduire (résolu ici en changeant le titre manuellement).

    Quelqu'un peut m'aider ?

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Sur un objet XML jdom, il me semble que tu peux faire un "setEncoding": recherche de ce côté quel encodage tu dois appliquer à ton fichier pour que ça marche
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Membre actif

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Par défaut
    Je ne pense pas que l'encodage de mon fichier soit incorrect. Je pense que le client a envoyé un caractère invalide, mais j'aimerais que cela ne compromette pas le fichier. Puis-je filtrer quelque part ?

  4. #4
    Membre éprouvé
    Inscrit en
    Septembre 2005
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 147
    Par défaut
    il faut certainement que tu le filtre en amont.
    crée un inputStream qui filtre les caratères.

    Je ne pense pas que l'encodage de mon fichier soit incorrect.
    oui certainement mais l'encodage par défaut de java n'est pas UTF-8 donc si tes fichiers xml sont en UTF-8, il faut que tu fasse un setEncoding("UTF-8");
    sinon il ne reconnaitra pas les caractères accentués par exemple.

    en UTF-8, il est peu probable que ton client ai réussi à entrer des caratères invalides. Tous les caractères des claviers français et anglais existent en UTF-8.

  5. #5
    Membre actif

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Par défaut le fin mot de l'histoire
    Bonjour,

    Quelques lignes que je prends le temps d'écrire pour donner la solution au problème.

    Il semble que, de temps à autre, des navigateurs ne respectent pas l'encodage utf-8 de la page et envoient leurs données mal encodées (par ex., l'apostrophe). Tant que ce sont eux qui les réaffichent, ça marche. Mais dès que le parser xml doit passer dessus, il produit cette exception.

    Pour ma part, la solution est simple : cette application a été migrée en Swing pour un tas d'autres raisons, je n'aurai plus à m'inquiéter de ça.

    Merci à tous pour vos contributions

Discussions similaires

  1. XML caractères invalides
    Par Mides dans le forum Langage
    Réponses: 4
    Dernier message: 14/02/2013, 08h44
  2. [XML]caractère de séparation des contenus des éléments
    Par ep31 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 13/12/2005, 11h07
  3. [XML] caractères interdits
    Par ep31 dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 02/12/2005, 20h05
  4. [ftp][bsd]caractère invalide dans un nom d'utilisateur.
    Par Invité(e) dans le forum Applications
    Réponses: 5
    Dernier message: 20/09/2005, 19h13
  5. [XML] caractères spéciaux dans un type NMTOKEN
    Par norkius dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 08/09/2004, 14h30

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