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 :

Eviter les erreurs fatales lors d'un parsing


Sujet :

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

  1. #1
    kij
    kij est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Points : 157
    Points
    157
    Par défaut Eviter les erreurs fatales lors d'un parsing
    Bonjour,

    Voici mon problème : je dois parser des fichiers XML assez gros, décrivant une suite de "documents", chaque documents ayant des informations, etc.

    Il se trouve que j'utilise SAX de la manière suivante:
    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
     
    		XMLReader reader = null;
    		SAXParser parser = null;
    		UEMEntityResolver myEntityRes = new UEMEntityResolver(getConfig());
    		FileInfoObj myFileInfoObj = null;
    		BasicHandler myBHandler = new BasicHandler(getConfig(), "Cp-500");
     
    		final SAXParserFactory factoryP = SAXParserFactory.newInstance();
     
    		try{
    			factoryP.setValidating(false);
     
    			parser = factoryP.newSAXParser();
     
    			// --- Initialize reader
    			reader = parser.getXMLReader();
     
    			reader.setContentHandler(myBHandler);
                            // --- Error handler qui récupère les erreurs et les enrichies
    			reader.setErrorHandler(myBHandler);
    			reader.setEntityResolver(myEntityRes);
                            ...
                            reader.parse(...);
                     }catch(....){
                         // Traitement des exceptions
                     }
    Dans l'un de mes fichiers XML d'entrée, sur la donnée de l'un des documents, j'ai cette suite de caractère : (OAM&P);

    Mon programme part en Fatal Error avec le message suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    org.xml.sax.SAXParseException: The reference to entity "P" must end with the ';' delimiter.
    J'aimerai savoir s'il y a possibilité de passer outre cette fatal error, à priori non, du moins c'est ce que je vois après avoir tenté ça dans mon error handler, et la javadoc précise qu'il n'est de toute manière pas possible d'empêcher l'arrêt du parser une fois ce type d'erreur levée.

    Existe-t-il un autre type de parser, similaire à SAX, mais au sein duquel il est possible de gérer les fatal error ?

    En vous remerciant pour votre aide.

    Cdlt.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Je ne sais pas s'il existe un parser qui fait ça (probablement qu'il en existe plein, mais je ne pense pas qu'ils soient très connus.)

    Mais je pense que ce n'est pas forcément ça qu'il faut chercher. Dans l'écosystème XML, une erreur fatale est une erreur grave. Le consensus est qu'un tel document n'est pas du XML et qu'il ne faut plus chercher à y toucher, point à la ligne. Cela peut donner de graves erreurs de traitement ou de sécurité, par exemple.
    Évidemment, si ce ne sont que des documents, c'est une autre histoire, ce n'est pas si grave.

    Bref, tout ça pour dire qu'un parser qui ferait ça ne s'entendrait sans doute pas très bien avec le reste de l'écosystème XML, parce que ce genre de choses sont censées être au pire exceptionnelles et se traiter au cas par cas.

    Pour le cas qui nous intéresse, je me contenterais de décorer l'InputStream qui contient le document, pour repérer les caractères & qui n'ont pas l'air de se terminer, et les remplacer à la volée par &.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Ton fichier n'est tout simplement pas un fichier XML valide, donc cela ne sert à rien de chercher une solution de contournement.

    Comme l'a dit thelvin, tu dois remplacer tes & par des &

  4. #4
    kij
    kij est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Points : 157
    Points
    157
    Par défaut
    Effectivement, en fait dans mon programme avant j'utilisais un parser maison, et donc je corrigeais à la volée certaines données, notamment les caractères réservé à l'XML.

    Et puis l'on ma demandé d'utiliser un parser Java "tout fait", hors depuis, j'ai des fatal error qui se lève sur des documents (à cause du contenu de certaines données qui ne sont effectivement pas du XML - caractère réservé à l'XML non converti en entity name par exemple)

    Bref, la solution serait de mettre en place un filtre sur les caractères réservé XML, les convertir à la volée s'ils ne représente pas une structure XML (entity name, tag, etc.).
    Cela revient au final à refaire un parseur maison en quelque sorte non ?
    Ou bien est-il possible de faire un filtre sur l'input que l'on donne au parseur directement ?

    Là où ça se devient plus "technique", c'est que mes fichiers XML peuvent être encodés en divers encodages (ebcdic par exemple). Donc si je mets en place un filtre sur l'input, je devrais alors décodé dans un premier lieu, filtrer, puis ré-encodé pour le parser... assez complexe à mettre en place je trouve pour éviter ce genre d'erreur.

    Mais si effectivement il n'y a que ça qui soit possible, je vais donc voir dans cette direction. Ou alors simplement discuter pour reprendre la version parseur maison ^^

    Merci pour votre aide dans tous les cas.

  5. #5
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Si tu y tiens, tu peux faire un stream intermédiaire qui lit ton stream d'origine et qui fait les manipulations à la volée. Si tu te lances là-dedans, fait bien attention à l'encodage...

  6. #6
    kij
    kij est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Points : 157
    Points
    157
    Par défaut
    Oui effectivement l'encodage serait à getter pour ne pas transformer la donnée.

    C'est pour cela que j'aimerai éviter cette solution si c'est possible.

    Je viens de tomber sur la classe Java suivante (XMLFilterImpl) :
    http://java.sun.com/j2se/1.4.2/docs/...ilterImpl.html

    Etant donné que la fatal error intervient dans la méthode 'characters', je me disais qu'en implémentant cette classe de filtre sur la donnée avant que cela appelle la vrai méthode 'characters', peut-être y a-t-il moyen de corriger la données à la volée, sans besoin de conversion puisque déjà "interprétée/convertie" par le parseur (sans pour autant être validée XML ?).

    Je précise que j'imagine que cela fonctionne ainsi, ne connaissant pas cette classe ni la manière dont elle s'utilise. Je testerai cela demain (sauf si quelqun me dit d'ici là que je fais fausse route ^^)

    Edit: non en fait cette classe prends comme source un XMLReader existant, et se fait appelé par celui-ci, ce qui ne convient donc pas.

  7. #7
    kij
    kij est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Points : 157
    Points
    157
    Par défaut
    Je clôture le sujet.


    J'ai fini par reprendre un parser fait maison, adapté à mes besoins.

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

Discussions similaires

  1. erreur fatale lors de l'installation de PostgreSQL
    Par caro_caro dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 13/02/2008, 18h51
  2. Erreur fatale lors du chargement d'un formulaire
    Par oldergod dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 12/11/2007, 14h33
  3. Réponses: 2
    Dernier message: 11/09/2006, 10h49
  4. Eviter les erreurs de saisie
    Par julo56 dans le forum C++
    Réponses: 5
    Dernier message: 06/06/2006, 00h04
  5. Eviter les erreurs lors de l'utilisation des compo Tsocket
    Par Coussati dans le forum Composants VCL
    Réponses: 5
    Dernier message: 01/02/2006, 19h14

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