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 :

org.xml.sax.SAXParseException probleme avec &nbsp [SAX]


Sujet :

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

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 19
    Points : 11
    Points
    11
    Par défaut org.xml.sax.SAXParseException probleme avec &nbsp
    Bonjour,

    J'ai probleme qui me bloque totalement. Enfaite j'ai développer une class qui lit des fichier XML reçu du serveur et a partir de ses fichier XML je créer un autre fichier XML baser sur les anciens. Le probleme c'est que parfois les fichier XML du serveur contiennent &nbsp ou un caractère special ce qui me donne ca:

    org.xml.sax.SAXParseException: The entity "nbsp" was referenced, but not declared.

    Je sais que la cause c'est l'espace enfaite. J'utilise cette partie du code pour charger le fichier XML que je vais lire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FileInputStream fileInputStream = new FileInputStream(new File(this.folder, scan[i]) );
    		    	InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
    		    	InputSource inputSource = new InputSource(inputStreamReader);
    j'ai voulu savoir si c'est possible a cette etape de supprimer tous les &nbsp qui se trouve dans le InputStream. Car je sais qu'il y a une autre method DTD mais franchement je viens de commencer dans le java donc je ne sais pas trop comment. Merci d'avance.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    Salut
    Il faut lire le contenu du fichier dans un String, faire un replaceAll(" ", " ") puis passer le SrtingReader(string remplacé) a ton InputSource

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    J'ai pas compris car c est pas possible de loader le contenu d'un xml a un String. Sauf si j'ete pas au courant lol. Si c'est possible de m'eclairer plus svp et merci beaucoup pour votre aide

    Edit: J'ai essayer une method pour changer le fichier en string mais le probleme c'est que le fichier xml ne va pas s'ouvrir tant que le probleme existe je ne reussie pas

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    File file = new File(fileName);
    char[] buf = new char[(int) file.length()];
    FileReader fr = new FileReader(file);
    int count = fr.read(buf);
    //Attention assure toi que count = buf.length
    String xml =  new String(buf, 0, count);
    xml.replaceAll(" ", " ");
    InputSource inputSource = new InputSource(new StringReader(xml));
    //...
    A++

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Citation Envoyé par hibour Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    File file = new File(fileName);
    char[] buf = new char[(int) file.length()];
    FileReader fr = new FileReader(file);
    int count = fr.read(buf);
    //Attention assure toi que count = buf.length
    String xml =  new String(buf, 0, count);
    xml.replaceAll(" ", " ");
    InputSource inputSource = new InputSource(new StringReader(xml));
    //...
    Juste pour peaufiner, "nbsp" c'est censé vouloir dire "non-breakable space", pas "space". Normalement ça devrait être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xml.replaceAll(" ", "\u00a0");
    Bon, sinon, une solution plus adaptée serait de mettre le parseur sans validation (puisque manifestement le document n'est pas valide) et éventuellement définir un comportement adapté quand on voit une entité   non résolue au parsing.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    Tu mélange entre document bien formé et document non valide. On utilise une DTD ou XML schema pour valider un document XML et savoir s'il respecte une certaine grammaire.
    Le caractère '&' à une interprétation spécial en Xml, et le parseur va vouloir le remplacer par une entité qui doit être définit dans le DOCTYPE dans le fichier DTD ou un peu avant dans un element <!ENTITY >
    Dans ton cas le parseur lancera toujour une exception à moins que tu inclus une DTD qui définit l'entité nbsp

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Je précise que c'est moi qui avait fait la dernière réponse, pas rasenganguy.

    Et je ne confonds rien du tout. J'admets que je n'arrive foutrement plus à convaincre mes parseurs de ne pas planter quand ils croisent une référence à une entité non déclarée. Je le faisais pourtant souvent avant, je me demande ce que j'ai changé, j'étais persuadé qu'il suffisait de ne pas les configurer avec validation.

    Mais bref, une référence d'entité non déclarée ne rend pas le document mal formé. C'est une erreur de validation. Et cette erreur doit pouvoir être ignorée, c'est expressément prévu par SAX, et c'est à ça que sert skippedEntity() dans SAX et plus ou moins EntityReference dans DOM (ça ne marche pas si la référence est dans un attribut bien sûr).

    Ça me semblait être un bon moyen de contourner le problème, sauf que je n'arrive pas à faire un programme qui l'illustre.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Bonjour a tous,
    Merci pour vos réponses ^^. Enfaite j'avais résolu le probleme mais d'une façon barbare en traitant le fichier XML comme n'importe fichier, l'ouvrir et le stocker dans un String et après vérifier ligne par ligne dans une boucle pour voir s'il y a une &. Ça prend genre 4mn dans le serveur pour que toutes les vérifications se terminent mais c'est pas un probleme pour le moment j'avais pas trop le temps mais je vais réutiliser vos idée pour améliorer le code . Merci encore.

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    C'est à peu près ce que hibour a proposé, sauf que sa solution utilise les méthodes fournies par Java et devrait être assez rapide.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Mais bref, une référence d'entité non déclarée ne rend pas le document mal formé. C'est une erreur de validation. Et cette erreur doit pouvoir être ignorée, c'est expressément prévu par SAX, et c'est à ça que sert skippedEntity() dans SAX et plus ou moins EntityReference dans DOM (ça ne marche pas si la référence est dans un attribut bien sûr).
    Autant pour moi Je ne connaissais pas cette fonctionnalité des parseurs.
    En plus je pensais qu'une référence non défini rendais un document mal formé
    Merci pour cette remarque
    A++

  11. #11
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Autant pour moi aussi.

    Dans certains cas ça rend bel et bien un document mal formé. Si j'ai bien compris la spec:

    SI un document XML n'indique pas de fichier DTD
    OU QUE sa déclaration XML indique standalone="true"
    L'UN OU L'AUTRE ET QUE il contient une référence à une entité qui n'est pas déclarée (ce serait possible dans le doctype)

    ALORS le document est mal formé.

    C'est à cause de ça que je n'arrivais pas à construire un exemple, car les parseurs respectent cette règle à la lettre, validation ou pas. Il "suffit" d'indiquer un doctype avec DTD et de dire au parseur de ne pas chercher la DTD en question, et là le parsing se passe bien, avec appel de skippedEntity().

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    Merci pour ces précisions on apprend tous les jours

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par hibour Voir le message
    Merci pour ces précisions on apprend tous les jours
    Oui se soir on dormira moin ....
    Merci pour tous ses explication disant que dans 1 semaines j'ai apris plein de choses sur l XML.

  14. #14
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Un peu tard
    En ajoutant:

    String htmlText =
    "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"+
    htmlTexte;

    Le parser connaît alors toutes les "entity" du html.

  15. #15
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Citation Envoyé par oduchateau Voir le message
    En ajoutant:

    String htmlText =
    "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"+
    htmlTexte;

    Le parser connaît alors toutes les "entity" du html.
    Certes, et il considère aussi qu'il doit valider du HTML, qui a dit que c'était le cas ?

    De plus il va les chercher sur le site du W3C, ce qui :
    - nécessite un accès Internet pour parser un fichier.
    - congestionne le réseau des deux côté : le tien et celui du W3C.

    Il est possible d'enregistrer le fichier xhtml1-transitional.dtd en local et de configurer le parseur pour utiliser la version locale plutôt que d'aller le chercher sur Internet. Mais ce n'est pas si simple que cela.

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

Discussions similaires

  1. Erreur dans JSP : org.xml.sax.SAXParseException
    Par MetalGearBe dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 12/02/2012, 21h58
  2. [SAX] Erreur "org.xml.sax.SAXParseException Content is not allowed in prolog."
    Par Wizard50 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 17/06/2011, 16h10
  3. XMLDecoder : org.xml.sax.SAXParseException
    Par benkil dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 16/03/2011, 09h56
  4. [org.xml.sax.ErrorHandler] Empecher les messages automatiques
    Par Emplyst dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 25/07/2006, 22h03
  5. [netbeans 5.0] Probleme : org.xml.sax.SAXParseException
    Par romarseille dans le forum NetBeans
    Réponses: 4
    Dernier message: 12/06/2006, 12h35

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