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 :

Presque bien formé


Sujet :

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

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2010
    Messages : 8
    Par défaut Presque bien formé
    Bonjour.

    Je travaille sur des dumps de base de donnée de Wikipedia & co. Donc, du bon gros fichier XML (1Go & plus).
    La structure de base, sa donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <page>
       <id> ... </id>
       <title> ... </title>
       <revision>
          <id> ... </id>
          <timestamp> ... </timestamp>
          <text> Plein de texte qui me pose des problèmes </text>
       </revision>
    </page>
    Le problème se situe au niveau de la balise <text> et de son contenu. En effet, dans les pages Wiki, on trouve parfois (souvent) du HTML. Ca ne pose généralement aucun problème, jusqu'au moment ou un petit malin écrit un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <nowiki><math></nowiki>
    Et là, c'est le drame. Du point de vue du parser XML (Woodstox dans mon cas), le tag "<math>" n'est pas fermé correctement et une exception est lancée, ce qui arrête net le parsing.

    Est il possible d'une manière ou d'une autre de contourner ce problème? J'aimerais si possible éviter l'ajout "préventif" de balise CDATA. C'est à dire ne pas traiter 10 Go de XML une première fois pour mettre des balises CDATA, et une 2ème pour récupérer l'information.

    Merci d'avance pour votre aide

  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
    Bah, c'est simple* : ne traite pas la base en entier avant. Pour chaque fichier, ajoute-lui d'abord le CDATA, puis fais-en quelque chose ensuite.
    Il est même possible de faire un Reader filtrant qui ajoute du <![CDATA[ ]]> là où il faut avant de le passer au parseur.

    * Bon, avec un peu de relatif sur le concept de "simple"... Il faut quand même détecter les balises <nowiki> et </nowiki>, avec éventuels whistespaces et peut-être même attributs...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2010
    Messages : 8
    Par défaut
    Je crois qu'il y'a un petit "misunderstanding" comme disent nos amis anglais

    La base, elle est dans un seul fichier, de plusieurs Go. Pas dans plein de petit fichiers.

    Après, le coup du reader spécialisé, ça m'interesse bien. Si tu pouvais m'en dire un peu plus...

    Et en fait il n'y a même pas besoins de reconnaitre le "<nowiki>", si c'est possible d'insérer des <![CDATA[ ]]> je colle tout le contenu de la balise "<text>" dedans et on en parle plus.

    Merci pour ta réponse rapide en tout cas

  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
    Ok, effectivement il ne reste que la solution du reader filtrant.

    Ben, il s'agit d'étendre FilterReader et redéfinir
    - read(char[], int, int) pour fonctionner à base de read()
    - read() pour insérer <![CDATA[ après <nowiki> et ]]> avant </nowiki>

    Ce n'est pas vraiment trivial, mais pas la mer à boire non plus.

    Tu construis ton AddCdataReader en lui filant le flux XML d'origine à manger, de préférence sous forme de BufferedReader si ce n'en est pas déjà un.

    Note : il existe peut-être déjà des APIs permettant de simplifier le boulot... Après tout il s'agit d'insertion conditionnée par regex à l'intérieur d'un flux, c'est un problème récurrent. Mais je n'en connais pas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  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 : 46
    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
    c'est tout sauf un fichier xml dans ce cas, le fichier est corrompu dès le départ, va falloir le corriger. Les "balise" faisant partie des données auraient du être protégées par l'outil ayant fait l'export vers du xml. Qu'est-ce que tu fera si un petit malin a écrit "</text>" dans son wiki?
    Le contenu du xml aurait du être soit

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <page>
       <id> ... </id>
       <title> ... </title>
       <revision>
          <id> ... </id>
          <timestamp> ... </timestamp>
          <text><![CDATA[<des><balises><de><texte><foireuses>]]></text>
       </revision>
    </page>
    (mais aurait posé problème aux contenus incluant aussi une balise CDATA, car pas d'échappement possible, donc limité en usage)
    ou, ce qu'on trouve en général car les balises CDATA on surtout pour but de faciliter le travail d'un humain qui lit/édite à la main, pas d'une machine
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <page>
       <id> ... </id>
       <title> ... </title>
       <revision>
          <id> ... </id>
          <timestamp> ... </timestamp>
          <text>&lt;des&gt;&lt;balises&gt;&lt;de&gt;&lt;texte&gt;&lt;foireuses&gt;</text>
       </revision>
    </page>

    Si le Xml n'est pas correct, tu peux dire adieux aux outils de parsing xml fournis avec java.

  6. #6
    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 : 46
    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
    Citation Envoyé par thelvin Voir le message
    Note : il existe peut-être déjà des APIs permettant de simplifier le boulot... Après tout il s'agit d'insertion conditionnée par regex à l'intérieur d'un flux, c'est un problème récurrent. Mais je n'en connais pas.
    Des api, non, mais des outils oui. Il existe sed sous unix permettant de filter un flux. Tu peux éventuellement le lancer et utiliser sa sortie comme entrée de ton reader. Mais c'est un emplâtre, il vaut mieux corriger au départ l'outil faisant l'exportation.

    Sans compter que ce qui t'intéresse, c'est le contenu de <text>, or si tu garde des balise de dans, ce sera des balises que tu aura dedans, pas du texte.

    La solutiion emplâtre la plus propre serait plutot de mettre les CDATA aux bord de <text>

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2010
    Messages : 8
    Par défaut
    Bon, après une énième vérification, je suis confus :O

    En fait, le problème que je rencontrais apparaissait sur une page de test. Je n'avais pas sélectionné cette page moi même...
    Il s'avère que la page en question est un copier-coller du menu d'édition d'une page wiki, réinsérée dans la structure XML, et pas un véritable extrait du dump.

    Dans le vrai dump, les balises sont bien échapées par des entités &lt; et &gt;. L'erreur donc, n'apparait pas en conditions réelles, seul le test était foireux.

    Merci pour vos réponses

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/07/2007, 10h25
  2. [SimpleXML] "Start tag expected, '<' not found" or le document est bien formé
    Par mithrendil dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 26/04/2007, 22h35
  3. MSXML : vérifier si un document XML est bien formé
    Par Patriarch24 dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 19/04/2006, 13h36
  4. [DTD][java]Verifier qu'un doc XML est bien formé
    Par bart64 dans le forum Valider
    Réponses: 3
    Dernier message: 08/01/2005, 14h17
  5. parser un XHTML bien formé (problème namespace)
    Par luta dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 18/10/2004, 12h55

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