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 :

Lecture d'un CDATA par la méthode characters [SAX]


Sujet :

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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Par défaut Lecture d'un CDATA par la méthode characters
    Bonjour.

    Je rencontre des difficultés lorsque je tente de parser le fichier XML suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <CONTENU>
    <ENR><![CDATA[28/07/2004 23:57:09,024|0|0||21|Lancement du scénario|35|Debut du téléchargement du scénario|0||0|0]]></ENR>
    <ENR><![CDATA[28/07/2004 23:57:10,126|0|0||21|Lancement du scénario|33|Fin du téléchargement du scénario|0||0|0]]></ENR>
    </CONTENU>
    En effet, dans ma méthode characters :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public void characters(char[] ch, int start, int length) {
             String cdata = new String(ch, start, length);
    Voici les valeurs de cdata pour les deux lignes (obtenues via debugguer) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cdata : "28/07/2004 23:57:09,024|0|0||21|Lancement du scénario|35|Debut du téléchargement du scénario|0||0|0"
    cdata : "28/07/2004 23:57:10,126|0|0||21|Lance"
    Comment se fait-il que la deuxième ligne ne contienne pas tout le CDATA ?!

    Voici le reste de mon code utilisé pour appeler le parseur :
    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
    public class ScenarioXMLParser extends DefaultHandler {
    private void parseSAX(File parsedFile) {
            try {
                SAXParserFactory spf = SAXParserFactory.newInstance();
                XMLReader xmlReader = spf.newSAXParser().getXMLReader();
     
                xmlReader.setContentHandler(this);
     
                //FileInputStream fis = new FileInputStream(parsedFile);
                //xmlReader.parse(new InputSource(fis));
     
                SAXParser sxp = spf.newSAXParser();
                sxp.parse(parsedFile, this);
     
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (SAXException e) {
                e.printStackTrace();
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            }
        }
     
     
        public void endElement(String namespaceURI, String localName, String qualifiedName) {
            String currentPath = pathToString();
            if (currentPath.equals("CONTENU/ENR")) {
                processRecord();
            }
            path.remove(path.size() - 1);
        }
     
     
        private String pathToString() {
            StringBuffer p = new StringBuffer("");
            for (int i = 0; i < path.size(); i++) {
                p.append(path.get(i));
                if (i < path.size() - 1) {
                    p.append('/');
                }
            }
            return p.toString();
        }
     
        private void processRecord() {
            try {
                recordProcessor.process(new ScenarioXMLRecord(headers, champsEnr, fileToParse));
                xmlRecordCount++;
            } catch (ScenarioRecordFormatException e) {
                String msg = "La ligne " + xmlRecordCount + "n'a pas le format attendu! " + e.getMessage();
                for (int i = 0; i < champsEnr.size(); i++) {
                    msg+= " " + champsEnr.get(i);
                }
                System.out.println(msg);
                e.printStackTrace();
                Logger.getLogger(ScenarioXMLParser.class.getName()).log(Level.SEVERE, null, e);
            }
        }
    }
    D'avance merci, je sèche là...

  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
    Comme indiqué par la JavaDoc de la méthode characters(), Le contenu texte d'un élément peut être envoyé soit en un appel de cette méthode, soit en plusieurs appels successifs.
    Il faut donc gérer le cas où les caractères ne sont pas envoyés en une fois, mais en plusieurs fois.

    NB : c'est souvent le cas avec les parsers SAX, puisque c'est une option délibérément laissée par SAX.
    NB2 : il n'est pas compliqué de faire une classe ContentHandler abstraite qui récupère les appels successifs à characters() et les concatène en un seul.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Par défaut
    Merci.


    C'est effectivement en stockant les cdata successifs que j'ai pu réussir à contourner le problème.

    La solution ne me paraissait pas très propre, mais vu qu'elle marche

  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
    Je suis assez d'accord, c'est pas très propre, et en général je préfère étendre une classe qui s'occupe de réunir les appels de characters() en un seul.

    Mais bon, cela permet d'éviter de réserver des tableaux immenses si on parse un fichier très textuel.
    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. cryptage d'un fichier par la méthode césar
    Par wedge.tm dans le forum C
    Réponses: 6
    Dernier message: 12/01/2007, 16h08
  2. Réponses: 3
    Dernier message: 02/01/2007, 13h53
  3. calcul de la racine carrée par la méthode de Newton
    Par annoussa dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 02/11/2006, 11h10
  4. connaitre les paramètres demandés par une méthode
    Par von_magnus dans le forum Tkinter
    Réponses: 4
    Dernier message: 25/07/2006, 14h22
  5. Réponses: 4
    Dernier message: 28/09/2005, 09h19

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