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 :

parser XML encoding [DOM]


Sujet :

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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 95
    Par défaut parser XML encoding
    Bonjour,

    Je parse une fichier XML récupéré depuis une URL:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    URL u = new URL(url);
    InputStream is = u.openConnection().getInputStream();
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(is);
     
    doc.getDocumentElement().normalize();
    Element root = doc.getDocumentElement();
    String info = root.getElementsByTagName("INFO").item(0).getTextContent();
    problème : dans la balise info j'ai quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <INFO>montexteİ</INFO>
    La String info prend la valeur "montexte?". Impossible de lire les caratére İ (turc) ou de conserver le pour l'envoyer tel quel à un navigateur web.

    J'ai essayé de passer par la chaine de caractère contenant le xml (via l'URL). Celle ci est correcte mais même avec le code suivant j'obtiens un "?" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    String xml = getXMLStringFromURL();
    String encoding = "iso-8859-1";
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Charset iso88591charset = Charset.forName(encoding);
    InputStream is = new ByteArrayInputStream(xml.getBytes(iso88591charset));
    J'ai essayé avec divers charset, sans succès.
    Même avec ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Document in = db.parse(is);
    Document doc = db.newDocument();
     
    Transformer xformer = TransformerFactory.newInstance().newTransformer();  
    Properties proprietes = new Properties();
    proprietes.put("method", "xml");
    proprietes.put("version", "1.0"); 
    proprietes.put("encoding", encoding); 
    proprietes.put("standalone", "yes");
    proprietes.put("indent", "yes");
    proprietes.put("omit-xml-declaration", "no");
    xformer.setOutputProperties(proprietes);
    xformer.transform(new DOMSource(in), new DOMResult(doc));
    Merci d'avance pour ceux qui auraient une piste.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    C'est normal, le parsing XML n'a aucun problème, lui .

    C'est quand tu envoies le résultat au navigateur, tu le fais avec un encodage qui ne gère pas les caractères turcs. Du coup, Java ne pouvant rien y faire, il replace İ par ?

    Rien à voir avec XML donc .
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 95
    Par défaut
    Le problème vient bien du XML.
    Le est transformé en ? dès que je récupère la valeur du tag depuis l'objet org.w3c.dom.Document.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(root.getElementsByTagName("INFO").item(0).getTextContent());
    Résultat : "montexte?" au lien de Si dans ma JSP je met un j'obtiens bien İ.

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Cela signifie simplement que System.out.println() ne gère pas ce caractère non plus. (plus exactement l'endroit où System.out.println() essaie d'écrire ne le gère pas.)

    Essaie de faire System.out.println("İ"); tu verras que ça ne marche pas non plus.
    System.out.println("\u0130"); non plus.

    Enregistre-le dans un fichier au format utf-8, à la place. Tu verras que ça marche parfaitement.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 95
    Par défaut
    System.out ne gère pas le caractère &#304 ; c'est pour ça qu'il est affiché tel quel dans la console avant le parsing. Après le parsing au lieu d'obtenir &#304 ; j'ai ?. Je ne veut pas obtenir İ mais bien &#304 ; pour l'insérer tel quel dans ma JSP et qu'ainsi le navigateur m'affiche İ.

    A la rigueur ce que m'affiche la console m'importe peu c'est juste un contrôle sur la transformation. J'aimerai juste avoir la même chose avant et après le parsing.

    enregistrer le texte dans un fichier correctement encodé ne fonctionne pas puisque si c'était le cas, mon navigateur afficherai İ et pas ?.

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    J'aimerai juste avoir la même chose avant et après le parsing.
    Les parseurs XMLs résolvent toujours cette notation &# 304;
    C'est normal, c'est leur rôle. Si ça ne te convient pas, rien ne t'empêche de le re-remplacer ensuite avec replaceAll(). Ou en utilisant un outil qui sait échapper ce qu'il doit.

    Citation Envoyé par lapin_hobbit Voir le message
    enregistrer le texte dans un fichier correctement encodé ne fonctionne pas puisque si c'était le cas, mon navigateur afficherai İ et pas ?.
    Uniquement si ce que tu envoies au navigateur est correct. Là aussi il faut faire attention à l'encodage. Par exemple, si tu renvoies une page que tu annonces encodée en iso-8859-1, et que tu y mets tel quel un caractère non géré par iso-8859-1, sans utiliser d'outil qui sache qu'il doit échapper les caractères non gérés, voilà ce qui arrive.

    Je le répète, le parsing n'a aucun souci. Cesse de contester, et commence à analyser ce que tu en fais ensuite qui pose problème.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XML] Parser XML
    Par RobinJulie dans le forum C++Builder
    Réponses: 2
    Dernier message: 03/02/2005, 08h48
  2. Parser XML -> PDF
    Par ebaynaud dans le forum Modules
    Réponses: 2
    Dernier message: 12/10/2004, 14h07
  3. [SAX] NoSuchElementException sur parser XML
    Par iceman dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 17/05/2004, 14h42
  4. parser xml
    Par billout dans le forum C++Builder
    Réponses: 4
    Dernier message: 20/11/2003, 11h08
  5. Parser XML
    Par miloux32 dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 18/07/2003, 03h17

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