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 :

Parse d'un fichier avec des '<'


Sujet :

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

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 18
    Par défaut Parse d'un fichier avec des '<'
    Bonjour,

    Je dois parser un fichier tiré d'un forum en JAVA et j'utilise SAX
    J'arrive a séparer les fils de discussion et les messages, mais ! je ne voudrais pas interpréter le contenu des messages.

    Je m'explique, dans les messages, j'ai, par exemple, ' x<k' . Lors du parse, SAX va considérer <k comme une balise et me dire que le fichier xml est mal formé -> exception !

    Ma question est donc de savoir si c'est possible de ne pas interpréter le contenu entre les balises de messages, <MSG> ... </MSG> ?

    Ou alors, une autre solution pour résoudre mon problème.

    Autre chose, mon fichier étant très gros (> 2Mo) je ne peux pas utiliser JDOM..
    Merci d'avance!

    Alban

  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
    Citation Envoyé par bamby44 Voir le message
    Je m'explique, dans les messages, j'ai, par exemple, ' x<k' . Lors du parse, SAX va considérer <k comme une balise et me dire que le fichier xml est mal formé -> exception !
    C'est normal, il l'est.

    Ma question est donc de savoir si c'est possible de ne pas interpréter le contenu entre les balises de messages, <MSG> ... </MSG> ?
    Pas implicitement, non.

    Mais si tu modifies ces balises pour qu'elles deviennent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <MSG><![CDATA[ ... ]]></MSG>
    ça ça le fera. Cette balise CDATA échappe tout son contenu, sans qu'il soit parsé (à l'exception de ]]>).

    Autre possibilité : remplacer x<k par x&lt;k

    Autre chose, mon fichier étant très gros (> 2Mo) je ne peux pas utiliser JDOM..
    C'est minuscule. À moins que tu aies besoin d'en charger des centaines en même temps, JDOM est parfaitement utilisable. Mais bon, JDOM n'est pas plus apte que SAX à résoudre ton problème.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ton fichier n'est clairement pas du XML, c'est quoi alors?

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2010
    Messages : 151
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    ton fichier n'est clairement pas du XML, c'est quoi alors?
    Bonjour,

    Notre TP nous impose un fichier texte précis. C'est quand même du XML mais avec une DTD qui serait la suivante (non donnée par le prof) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <!ELEMENT FORUM (FIL*) >
    <!ELEMENT FIL (MSG*) >
    <!ATTLIST FIL TITRE #PCDATA #REQUIRED>
    <!ELEMENT MSG (#PCDATA)>
    <!ATTLIST MSG
        AUTEUR #PCDATA #REQUIRED
        DATE #PCDATA #REQUIRED >
    nous avons rajouté une balise globale <FORUM> dans lequel nous avons nos fils. Cette balise n'était pas dans notre fichier d'origine. mais je ne sais pas si nous avons le droit de modifier ce fichier.

    Voici un extrait du fichier texte à parser (qui soulève l'erreur) :
    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
    <FIL TITRE="Affichage de combinaisons">
      <MSG AUTEUR="Mikel" DATE="Dim 2 jan 2005 10:59">
        Bonjour à tous, et bonne année!
     
        Je cherche un algorithme capable d'afficher toutes les combinaisons
        possibles  de m éléments pris dans un ensemble de n éléments.
        n <=30 et bien sûr m<=n..
        Pas de problème jusqu'à n=5 ou 6, mais ne n'ai pas réussi à généraliser....
     
        Ex: soit 4 objets {a, b, c,d}
        si m=4 --> on affiche les combinaisons de 4 objets (abcd)
        si m=3 --> on affiche les combinaisons de 3 objets (abc), (acd), (bcd)
        si m=2 --> on affiche les combinaisons de 2 objets (ab), (ac), (ad), (bc),
        (bd), (cd)
     
        Merci pour vos conseils!
     
        NB: j'utilise VBA Excel pour mon application
     
        Cordialement, Mikel
      </MSG>
      <MSG AUTEUR="Jean-Marc Bourguet" DATE="Dim 2 jan 2005 11:08">
        http://sunburn.stanford.edu/~knuth/news.html
     
        Voir Previews of Volume 4.  Tu devrais y trouver plus que ce que tu ne
        veux.
     
        A+
      </MSG>
    </FIL>
    Voici l'erreur obtenue :
    org.xml.sax.SAXParseException: The content of elements must consist of well-formed character data or markup

    merci,

    Mathieu

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    d'ou viens ce "xml". De votre prof? Si oui, renvoyez le lui, ce n'est PAS du xml! du XML ce serait ça
    Code xml : 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
    <fil titre="Affichage de combinaisons">
      <msg auteur="Mikel" date="Dim 2 jan 2005 10:59">
        <![CDATA[
        Bonjour à tous, et bonne année!
     
        Je cherche un algorithme capable d'afficher toutes les combinaisons
        possibles  de m éléments pris dans un ensemble de n éléments.
        n <=30 et bien sûr m<=n..
        Pas de problème jusqu'à n=5 ou 6, mais ne n'ai pas réussi à généraliser....
     
        Ex: soit 4 objets {a, b, c,d}
        si m=4 --> on affiche les combinaisons de 4 objets (abcd)
        si m=3 --> on affiche les combinaisons de 3 objets (abc), (acd), (bcd)
        si m=2 --> on affiche les combinaisons de 2 objets (ab), (ac), (ad), (bc),
        (bd), (cd)
     
        Merci pour vos conseils!
     
        NB: j'utilise VBA Excel pour mon application
     
        Cordialement, Mikel
      ]]></msg>
      <msg auteur="Jean-Marc Bourguet" date="Dim 2 jan 2005 11:08">
        http://sunburn.stanford.edu/~knuth/news.html
     
        Voir Previews of Volume 4.  Tu devrais y trouver plus que ce que tu ne
        veux.
     
        A+
      </msg>
    </fil>



    ou ça
    Code xml : 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
     
    <fil titre="Affichage de combinaisons">
      <msg auteur="Mikel" date="Dim 2 jan 2005 10:59">
        Bonjour à tous, et bonne année!
     
        Je cherche un algorithme capable d'afficher toutes les combinaisons
        possibles  de m éléments pris dans un ensemble de n éléments.
        n &lt;=30 et bien sûr m&lt;=n..
        Pas de problème jusqu'à n=5 ou 6, mais ne n'ai pas réussi à généraliser....
     
        Ex: soit 4 objets {a, b, c,d}
        si m=4 --&gt; on affiche les combinaisons de 4 objets (abcd)
        si m=3 --&gt; on affiche les combinaisons de 3 objets (abc), (acd), (bcd)
        si m=2 --&gt; on affiche les combinaisons de 2 objets (ab), (ac), (ad), (bc),
        (bd), (cd)
     
        Merci pour vos conseils!
     
        NB: j'utilise VBA Excel pour mon application
     
        Cordialement, Mikel
      </msg>
      <msg auteur="Jean-Marc Bourguet" date="Dim 2 jan 2005 11:08">
        http://sunburn.stanford.edu/~knuth/news.html
     
        Voir Previews of Volume 4.  Tu devrais y trouver plus que ce que tu ne
        veux.
     
        A+
      </msg>
    </fil>
    Si le xml n'est pas valide, tu ne pourra utiliser aucune des libraires xml fournies en standard. Et pour cause, les spécification xml OBLIGENT les parseur xml à s'arreer avec un erreur dès qu'ils rencontrent un xml mal formé. Un "parseur" que serait laxiste ne serait plus un parseur.


    Votre TP mentionne-t-il "xml" ? ou juste uqe vous devez parser ce fichier?

    Dans le premier cas, si xml est mentionné, le vichier que vous avez n'est pas correct au regard de l'énoncé, clarifier avec le prof
    Dans le second cas, vous oubliez tout parseur xml, voitre prof vous a juste filé un fichier qui me semble être du SGML (jamais travaillé avec, j'en suis pas certains à 100%) qui ressemble à du xml mais est plus vaste. Il autorise notament les fermetures implicites de balise. Mais je ne suis même pas sur que ton "<" soit uatorisé même en SGML

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2010
    Messages : 151
    Par défaut
    Désolé pour la confusion avec le XML, disons que c'est du pseudo-xml. le fichier est une archive d'un forum.

    Le fichier donné par le prof est un fichier texte au format txt.

    Voici les informations que l'on a sur le fichier texte :
    Les messages d’un forum sont organisés par fil de discussion correspondant à un ensemble de messages
    répondant à une demande originelle. Un fil de discussion se distingue par un intitulé, chaque message
    d’un fil étant essentiellement identifié par son auteur et sa date de rédaction.
    Vous trouverez sur Madoc une archive contenant une sélection des messages postés sur le forum Usenet
    fr.comp.algorithmes depuis janvier 2005. Cette archive comporte des balises permettant de faire ressortir
    les 2981 messages, répartis en 383 fils et échangés par 489 auteurs, qu’elle comporte. Prenez connaissance
    de ces balises et familiarisez-vous avec la structure de ce document. Une étape de votre travail consistera
    à écrire un analyseur syntaxique capable d’extraire chaque message d’un tel fichier.
    Donc pour nous, impossible d'utiliser les parseurs de XML apparemment. Est-on obligé de parser le fichier texte ligne par ligne ?

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ben je dirait, comme un bourrin, que le plus facile reste, dans un premier temps
    -> de répérer le <MSG et </MSG>
    -> de mettre le contenu entre <[CDATA[
    -> d'envoier enfin vers un parseur xml

    Bref de la transformation avant envoi vers xml


    Maintenant, que ferez vous lorsque vous aurrez dans une message:

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     <MSG AUTEUR="tchize" DATE="Dim 1 jan 2010 10:00">
     Alors, pour parser les message du forum, c'est facile. Il te suffit de télécharger le ficheir texte, et de repérer la balise MSG. 
    Tout document fini par une balise </MSG>
    Tu vois, ce n'est pas bien compliqué à faire? (Ou pas....)
    </MSG>

  8. #8
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2010
    Messages : 151
    Par défaut
    Merci, on va essayer de faire en ajoutant le CDATA.
    quand au </MSG> au milieu d'un message, à mon avis c'est gérable car </MSG> doit toujours être suivi d'une balise ouvrante <MSG AUTEUR...> ou d'une balise fermante </FIL>

    Si ça ne marche pas, on fera du parse ligne par ligne en concaténant jusqu'à les balises de fin.

    Bon Week-end à tous,

    Mathieu

  9. #9
    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
    Citation Envoyé par matll Voir le message
    quand au </MSG> au milieu d'un message, à mon avis c'est gérable
    Ce n'est pas gérable, c'est mathématiquement démontré depuis la nuit des temps.

    Dans les cas que tu montres, eh bien eux aussi ils peuvent être à l'intérieur d'un message, évidemment ! Tu vas faire quoi dans ce cas ? Pas la peine de te creuser la tête pendant des heures, cette façon de faire ne marche pas, c'est démontré et bien connu.

    Le workaround est donc d'échapper les caractères < et & quand ils font partie du contenu. Pour ça, il y a <![CDATA[ ]]> ou bien les remplacer respectivement par &lt; et &amp;
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    sauf qu'il a pas le choix, le fichier existe déjà, il va falloir faire avec. Il pourra pas gérer tous les cas de présence de </MSG>, c'est vrai, mais pourra au moins gérer les cas es plus courant, à la bidouille parce qu'il y a pas d'autre mot ^^ Et puis, ca fait la nuit des temps aussi que les navigateur arrivent à gérer des fichier mal formé, des balises non fermées ou mal placées

  11. #11
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2010
    Messages : 151
    Par défaut
    Bonjour,

    Finalement, le rajout du <![CDATA[ (solution qui fonctionne, pour avoir testé en les rajoutant à la main) m'obligeant à parcourir tout mon texte pour ensuite parser mon fichier, j'ai décidé d'abandonner cette option pour finalement lire mon texte ligne par ligne. et ainsi je peux gérer les </MSG> en cours de ligne ainsi que les autres <k indiquées comme balise ouvrante par SAX.

    Le parcours ligne par ligne ne met pas tant de temps que ça (342ms pour un fichier de plus de 52000 lignes). Et le prof ne tient pas compte de la complexité pour le parsage du fichier, donc je pense que notre solution est acceptable, voici notre solution pour ceux qui veulent ou rencontreraient le même problème que nous :

    Code java : 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
    private static void parseTxt(String nomFichier){
    		String chaine = "";
    		Fil f = null;
    		Message m = null;
    		String ligne = "";
    		//lecture du fichier texte	
    		try{
    			InputStream ips = new FileInputStream(nomFichier); 
    			InputStreamReader ipsr = new InputStreamReader(ips);
    			BufferedReader br = new BufferedReader(ipsr);
    			while ((ligne=br.readLine())!=null){
    				ligne = ligne.trim(); // Suppression des espaces en début et fin de ligne
    				if(ligne.contains("<FIL TITRE=")){
    					String titre = ligne.substring(12, ligne.length()-2);
    					f = new Fil(titre);
    				}else if(ligne.contains("<MSG AUTEUR=")){
    					String auteur = ligne.substring(13, ligne.indexOf("DATE=")-2);
    					String date = ligne.substring(ligne.indexOf("DATE=")+6, ligne.length()-2);
    					m = new Message(auteur, date, "");
    					chaine = "";
    				}else if(ligne.equals("</MSG>")){
    					m.setTexte(chaine);
    					f.ajoutMessage(m);
    					m = null;
    				}else if(ligne.equals("</FIL>")){
    					arrayFil.add(f);
    					f = null;
    				}else{
    					// Texte du message
    					chaine+=ligne+"\n";
    				}
    			}
    			br.close(); 
    		}		
    		catch (Exception e){
    			System.out.println(e.toString());
    		}
     
    	}

    Mais cette solution n'est interessante que pour des codes pseudo-xml contenant peu de balises, (ici,on n'en a que deux).

    Encore merci à tous et bon dimanche,

    Mathieu (& Alban)

Discussions similaires

  1. [ API JDIC ] Ouvrir un fichier avec des paramètres
    Par macmanus dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 11/05/2007, 15h32
  2. [XSL] Problème de parse d'un fichier avec Namspaces
    Par mpereg dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 20/02/2007, 19h24
  3. Problème de chemin de fichier avec des espaces
    Par Akronyme dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 11/12/2006, 17h12
  4. Réponses: 6
    Dernier message: 29/11/2006, 11h56
  5. Réponses: 1
    Dernier message: 31/10/2006, 15h06

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