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

Langage Perl Discussion :

Contrôle de cohérence de balise


Sujet :

Langage Perl

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Contrôle de cohérence de balise
    Bonsoir,

    Je viens vers vous en dernier recours.

    Mon problème: je dois contrôler les balises d'un fichier qui se presente sous cette forme:

    $line='<CM><CA>151264;GSM;N;0:1611021;20060726100000;20060726123000;495020510625278;208200400100004;+33668851302;+0000<Q>DU;CO;S;9000</Q><Q>DU;IM;S;5400</Q><
    Q>iiiii</Q><CC>10;256</CC><CC>type2;257</CC></CA><TT>0;-1;20060726100000;0060726123000;20060726100000;1;F</TT><F>GSM;MSC;TS11;MSO;33660000007<EU>T<TV>2006072
    6100000;20060726123000;;20820;;MSISDN;+33142235066;+33142235066;00050426</TV><SC>1;2;3</SC><QS>1;2</QS><QS>3;4</QS><CC>20;AUTRE</CC><IC>1;F</IC><Q>MO;VA;EUR;
    37.62</Q><Q>DU;VA;S;9000</Q><Q>DU;CO;S;9000</Q><Q>DU;IM;S;5400</Q><Q>MO;IM;EUR;15.048</Q><LV>202;202100;ETU1375;EF202;1;MSO_NAT;706010;706010;1;2006072714322
    6;;<NO>GEO;60</NO><I>061611021;102;FORFAIT_PRINCIPAL;2;20060725;20060815;1;20060726100000;0.6;1;0;1;FP202;FFT<PI>1<;2</PI><Q>DU;IM;S;5400</Q><Q>DU;VA;S;5400<
    VD>1</VD></Q><Q>DU;CO;S;5400</Q><Q>MO;VA;EUR;22.572</Q></I></LV><LV>202;202HF00;ETU2285;EF202;1;MSO_NAT;706010;706010;1;20060727143226;;E<ERREUR_NO>1;2</NO><
    I>061611021;101;HORS FORFAIT;2;20060725;20060815;1;20060726100000;0.4;0;0;1;GSMT1;HF<Q>MO;IM;EUR;15.048</Q><Q>MO;VA;EUR;15.048<VD>1</VD></Q><Q>DU;CO;S;3600</
    Q><Q>DU;VA;S;3600</Q></I></LV>
    </EU></F></CM>';


    J'analyse toutes les balises pour savoir si elles sont bien présentes et qu'il n'y a pas de cochonnerie au milieu.

    Ma regexp donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if ($line =~ m /^<CM><CA>[^<]+(<Q>[^<]+<\/Q>)+(<CC>[^<]+<\/CC>)+<\/CA><TT>[^<]+<\/TT><F>[^<]+<EU>.<TV>[^<]+<\/TV><SC>[^<]+<\/SC>(<QS>[^<]+<\/QS>)+(<CC>[^<]+<
    \/CC>)+<IC>[^<]+<\/IC>(<Q>[^<]+<\/Q>)+(<LV>[^<]+(<NO>[^<]+<\/NO>)+(<I>.*(<PI>.*<\/PI>)?(<Q>.*(<VD>.*<\/VD>)?<\/Q>)+<\/I>)<\/LV>)*/ )
    {
    print "1:$1\n";
    print "2:$2\n";
    print "3:$3\n";
    print "4:$4\n";
    print "5:$5\n";
    print "6:$6\n";
    print "7:$7\n";
    print "8:$8\n";
    print "9:$9\n";
    }
    Ce qu'il faut savoir c'est que les balises <Q> <CC> <QS> <NO> <LV> peut-être multiple de 1 à N

    Le problème survient sur la balise <LV>, qui dans cette exemple est présente deux fois. C'est la seule balise multiple qui contient d'autres balises.
    j'ai généré une erreur dans la deuxième <LV> sur la balise <ERREUR_NO>1;2</NO> mais il l'a prends pas en compte car si on regarde le résultat de $6 on voit qu'il recupère directement les deux balises LV
    <LV>.....</LV><LV>.......</LV>

    $6:<LV>202;202100;ETU1375;EF202;1;MSO_NAT;706010;706010;1;20060727143226;;<NO>GEO;60</NO><I>061611021;102;FORFAIT_PRINCIPAL
    ;2;20060725;20060815;1;20060726100000;0.6;1;0;1;FP202;FFT<PI>1<;2</PI><Q>DU;IM;S;5400</Q><Q>DU;VA;S;5400
    <VD>1</VD></Q><Q>DU;CO;S;5400</Q><Q>MO;VA;EUR;22.572</Q></I></LV><LV>202;202HF00;ETU2285;EF202;1;MSO_NAT;706010;
    706010;1;20060727143226;;E<ERREUR_NO>1;2</NO><I>061611021;101;HORS FORFAIT;2;20060725;20060815;1;20060726100000;0.4;0;0;1;GSMT1;HF<Q>MO;IM;EUR;15.048</Q>
    <Q>MO;VA;EUR;15.048<VD>1</VD></Q><Q>DU;CO;S;3600</Q><Q>DU;VA;S;3600</Q></I></LV>

    Il faut que ma regexp analyse les lignes LV une par une...

    Le problème vient de cette partie là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .... +(<LV>[^<]+(<NO>[^<]+<\/NO>)+(<I>.*(<PI>.*<\/PI>)?(<Q>.*(<VD>.*<\/VD>)?<\/Q>)+<\/I>)<\/LV>)*/

    Mais je ne sais plus quoi faire....

    Si quelqu'un à des idées... (je bosse en perl et la solution la plus simple serait de contrôler lorsque avec des boucles dans mon code, mais j'aimerais bien réussir cette regexp :p )

    Merci d'avance

  2. #2
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 61

    Informations forums :
    Inscription : Février 2007
    Messages : 34
    Points : 44
    Points
    44
    Par défaut XML
    J'ai trouvé ça qui semble zarbi

    <PI>1<;2</PI>.

    Sinon, ça ressemble beaucoup à du XML et le moyen le plus simple de vérifier la conformité du XML est d'écrire une DTD ou un schéma. Puis de parser le fichier ou la chaine qu'on veut contrôler en activant la le contrôle par rapport à un schéma.

    En Perl, XML::Xerces fait ça très bien.

Discussions similaires

  1. Contrôle de cohérence
    Par edwix dans le forum UML
    Réponses: 5
    Dernier message: 12/03/2014, 08h09
  2. Contrôle de cohérence des <summary>
    Par sierramike dans le forum C#
    Réponses: 2
    Dernier message: 12/03/2012, 12h50
  3. [AC-2003] Contrôle de cohérence
    Par flomen dans le forum VBA Access
    Réponses: 9
    Dernier message: 11/05/2011, 10h38
  4. Réponses: 9
    Dernier message: 26/01/2011, 09h56
  5. Réponses: 2
    Dernier message: 26/11/2005, 16h17

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