1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2017
    Messages : 25
    Points : 11
    Points
    11

    Par défaut [DEBUTANT] Questions sur des comparaisons xml-csv

    Bonjour à tous!
    Je me suis récemment mis au Perl dans el cadre d'un stage, mais je rencontre quelques problèmes à mesure que je réfléchis à comment coder...
    Voilà mon problème j'ai un fichier xls à comparer avec un fichier csv.
    Je pensais mettre le contenu de ces fichiers dans des tableaux puis les traiter par expressions régulières, mais certains sites disent qu'il s'agit là d'une mauvaise pratique, et même après avoir lu plusieurs de vos cours, je ne suis toujours pas certain de la marche à suivre... Quel serait donc la meilleure manière de procéder?
    J'ai vu des parsers de xml à foison sur le CPAN et ne sais pas vraiment lequel utiliser, sachant que je n'y ai jamais touché et que mon fichier xml ne ressemble pas à ce que je connais, niveau "architecture" (faute d'un meilleur terme).
    Que me conseilleriez-vous, vous qui êtes expérimentés?
    Merci d'avance!

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    2 939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mai 2012
    Messages : 2 939
    Points : 9 394
    Points
    9 394
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par LeNoobEnPerl Voir le message
    ... sachant que ... mon fichier xml ne ressemble pas à ce que je connais, niveau "architecture" (faute d'un meilleur terme).
    Bonjour,

    La question, au vu de ta demande, est la suivante: est-ce que c'est du vrai XML valide, ou non? Si ce n'est pas du XML valide, alors les parsers XML existants seront sans doute incapables d'en extraire les données.

    Pourrais-tu fournir un échantillon de tes données en entrée, afin que l'on puisse essayer de se faire une idée.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2017
    Messages : 25
    Points : 11
    Points
    11

    Par défaut

    Bien sûr, il s'agit de cette forme-ci :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <ITEM attribut1="valeur1" attribut2="valeur2">
    	<VERSION numeroVersion="numéro">
    		<CONCRETISATIONDELAVERSION numerodelaversion="1"/>
    	</VERSION>
    	<ITEMQUICOMPOSELEPREMIER attribut1="valeur1" attribut2="valeur2">
    		<VERSION numeroVersion="numéro">
    			<CONCRETISATIONDELAVERSION numerodelaversion="1"/>
    			</ITEMQUICOMPOSELEPREMIER>

    En gros, les items sont composés de 1 ou + versions (chaque version étant concrétisée), ainsi que de 0 ou plus items (des pièces/composants du coups) qui le composent.
    Or je dois comparer ces items dans le xml avec un fichier csv pour vérifier que les 2 sont bons et qu'il n'y aie pas d'erreurs dans la base dont le xml est extrait.

    Je sais pas si c'est très clair...
    J'aimerais pouvoir être un peu plus précis sur la structure du xml, mais vu la politique de sécurité super stricte de mon employeur, je ne pense pas en avoir le droit...

    PS : J'ai un peu foiré l'inclusion de mon code, je sais pas trop comment ça marche

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    2 939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mai 2012
    Messages : 2 939
    Points : 9 394
    Points
    9 394
    Billets dans le blog
    1

    Par défaut

    Bon, je ne suis vraiment pas expérimenté dans l'utilisation du XML, mais, à vue de nez, ça ressemble à du XML correct.

    Donc, il est effectivement recommandé d'utiliser un module spécialisé comme par exemple les modules XML::Twig ou XML::LibXML, voire peut-être XML:: Parser.

    Je te conseille ce tutoriel de l'ami Djibril: http://djibril.developpez.com/tutoriels/perl/perl-xml/ pour en savoir plus.

    Avec, toutefois, une toute petite réserve: Djibril mentionne en passant XML::Simple parmi les nombreux modules utilisables, je pense qu'il y a consensus dans la communauté que ce module n'est plus guère recommandé.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2017
    Messages : 25
    Points : 11
    Points
    11

    Par défaut

    Justement, j'avais lu ce cours et je me demandais ce qui rend twig si "facile" à utiliser. J'ai lu la doc sur le CPAN et ça ne me semble pas très facile.

    Et quand on parse (avec twig, parser ou libxml), est-ce possible de mettre chaque ligne dans une case d'un tableau pour ensuite les traiter par expressions régulières? J'avais lu quelque part que beaucoup de programmeurs considèrent cela comme une mauvaise pratique, mais étant donné sa simplicité, je ne comprends pas pourquoi.

    Mon code avec XML::Simple :

    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    my adresseXML;
    do
    {
    <div style="margin-left:40px">print "Etape 1 : Saisissez l'adresse du fichier XML\n";</div><div style="margin-left:40px">chomp($adresseXML = <STDIN>); #on récupère ici l'adresse du fichier XML</div>} while (! $adresseXML);
    my $parser = XML::Simple->new( NoAttr=>1, RootName=>'data' );
    my $handlerXML = $parser->XMLin($adresseXML);
    print Dumper $handlerXML;

    Cela par exemple marcherait-il pour afficher la structure du xml? Sur le cours de Djibril, il est dit que le xml sous la forme que j'ai montrée avant, une fois traité ainsi, donne des résultats surprenants...




    Et voilà ma tentative avec XML::Twig :

    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ######################
    #TENTATIVE AVEC TWIG
    ######################
    my adresseXML;
    do
    {
    <div style="margin-left:40px">print "Etape 1 : Saisissez l'adresse du fichier XML\n";</div><div style="margin-left:40px">chomp($adresseXML = <STDIN>); #on récupère ici l'adresse du fichier XML</div>} while (! $adresseXML);
    my $twig = new XML::Twig;
    $twig->parsefile($FichierXML); #création d'un objet twig
    my $root = $twig->root; #racine du XML

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2017
    Messages : 25
    Points : 11
    Points
    11

    Par défaut

    Je suis au regret d'informer ceux qui chercheraient à traiter des fichiers xml aussi imbriqués que je n'ai pas de solution à vous offrir :/
    J'ai été obligé de me bricoler mon propre parseur à grands coups de regexps artisanales et totalement dégueulasses...
    Si vous tombez sur le même programme, je vous suggère de considérer votre fichier comme un simple fichier texte et de le découper à la regexp.

  7. #7
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    18 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 18 938
    Points : 495 362
    Points
    495 362

    Par défaut

    Je le dis et le répète : très très très mauvaise idée de bricoler du XML avec des regex, mais vraiment très très très mauvaise façon de faire.

    Tu veux analyser du XML, quelque soit le langage de programmation, tu apprends à utiliser un parseur existant.

    Perl le fait de façon excellente. XML::Twig ou XML::LibXML. Prends le te temps nécessaire pour comprendre leur fonctionnement, notamment le premier.
    J'ai déjà posté des tas d'exemples sur ce forum pour analyser du XML dans tous les sens et quelque soit leur taille (quelque ko ou plusieurs Go).

    Si tu as besoin d'aide :
    1- Tu précises tes versions d'OS et de Perl ;
    2- Tu donnes des exemples clairs et précis de tes XML, ta problématique...
    3- Tu nous montres ce que tu as essayé de faire.

    Et ce n'est qu'après quelques efforts de ta part que l'on pourra t'aider, te guider.
    Tout se résume en la compréhension du parseur ET de l'algorithme que tu mets en place.

    Mais je le répète. Oublie les regex pour analyser du XML.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2017
    Messages : 25
    Points : 11
    Points
    11

    Par défaut

    Citation Envoyé par djibril Voir le message
    Je le dis et le répète : très très très mauvaise idée de bricoler du XML avec des regex, mais vraiment très très très mauvaise façon de faire.

    Tu veux analyser du XML, quelque soit le langage de programmation, tu apprends à utiliser un parseur existant.

    Perl le fait de façon excellente. XML::Twig ou XML::LibXML. Prends le te temps nécessaire pour comprendre leur fonctionnement, notamment le premier.
    J'ai déjà posté des tas d'exemples sur ce forum pour analyser du XML dans tous les sens et quelque soit leur taille (quelque ko ou plusieurs Go).

    Si tu as besoin d'aide :
    1- Tu précises tes versions d'OS et de Perl ;
    2- Tu donnes des exemples clairs et précis de tes XML, ta problématique...
    3- Tu nous montres ce que tu as essayé de faire.

    Et ce n'est qu'après quelques efforts de ta part que l'on pourra t'aider, te guider.
    Tout se résume en la compréhension du parseur ET de l'algorithme que tu mets en place.

    Mais je le répète. Oublie les regex pour analyser du XML.
    En effet, j'avais bien lu dans le cours sur perl et XML disponible ici que c'était à éviter, mais ne m'en sortant pas avec les modules XML, j'ai (par désespoir de cause) dû recourir à des regex...
    Le problème venait de la complexité du fichier XML, je n'avais jamais vu un fichier aussi "profond" (faute d'un meilleur terme), et il n'était pas accompagné d'une DTD, puisque sa structure était variable.
    S'il avait été plus simple, je pense que j'aurais réussi quand je bidouillais des bouts de code avec des parsers, cela dit.
    Et je suis d'accord que vu la galère que c'est, inutile de réinventer la roue. S'il est possible de faire quelque chose avec un module présent sur le CPAN, ils sont à privilégier (plus facile, plus rapide etc...)

    Pour vous donner une idée, voici à quoi ressemblait mon fichier... (les valeurs sont toutes aléatoires, n'y faites pas attention, elles ne sont là qu'à titre d'exemple)
    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
    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
     
    <TETE_ITEM DESI_EN="ITEM" CODE_AECMA="12345678912" ECHELON4M="Vrai" ECHELON1="Vrai">
    	<VERSION_ITEM NUMBER="123456" VERSION="A">
    		<CONCRETISATION QTE_TCI="1" ISN_AECMA="00A" CODE_OTAN_ART="MONENTREPRISE" REF_ARTICLE="9876543210">
    		</CONCRETISATION>
    	</VERSION_ITEM>
    	<VERSION_ITEM NUMBER="654321" VERSION="B">
    		<CONCRETISATION QTE_TCI="1" ISN_AECMA="00B" CODE_OTAN_ART="MONENTREPRISE" REF_ARTICLE="0123456789">
    			<LABEL COMMENT_LABEL="Post MOD C12341"/>
    		</CONCRETISATION>
    	</VERSION_ITEM>
    	<MASTER_ITEM DESI_EN="PART 1 OF ITEM" CODE_AECMA="21987654321" ECHELON4M="Faux" ECHELON1="Vrai">
    		<VERSION_ITEM NUMBER="456789" VERSION="A">
    			<CONCRETISATION QTE_TCI="1" ISN_AECMA="00A" CODE_OTAN_ART="PRESTATAIRE" REF_ARTICLE="4567891230">
    			</CONCRETISATION>
    		</VERSION_ITEM>
    	</MASTER_ITEM>
    	<MASTER_ITEM DESI_EN="ENSEMBLE 2 OF ITEM" CODE_AECMA="0123987654" ECHELON4M="Faux" ECHELON1="Vrai">
    		<VERSION_ITEM NUMBER="987654" VERSION="A">
    			<CONCRETISATION QTE_TCI="1" ISN_AECMA="00A" CODE_OTAN_ART="AUTREENTREPRISE" REF_ARTICLE="5358912730">
    			</CONCRETISATION>
    		</VERSION_ITEM>
    		<VERSION_ITEM NUMBER="987123" VERSION="B">
    			<CONCRETISATION QTE_TCI="1" ISN_AECMA="01B" CODE_OTAN_ART="AUTREENTREPRISE" REF_ARTICLE="4368912730">
    				<LABEL COMMENT_LABEL="Post MOD C12344"/>
    				<LABEL COMMENT_LABEL="Pre MOD C12345"/>
    			</CONCRETISATION>
    		</VERSION_ITEM>
    		<MASTER_ITEM DESI_EN="ENSEMBLE 21 OF ITEM" CODE_AECMA="0657987654" ECHELON4M="Faux" ECHELON1="Vrai">
    			<VERSION_ITEM NUMBER="123654" VERSION="A">
    				<CONCRETISATION QTE_TCI="1" ISN_AECMA="07A" CODE_OTAN_ART="MONENTREPRISE" REF_ARTICLE="4368972130">
    				</CONCRETISATION>
    			</VERSION_ITEM>
    		</MASTER_ITEM>
    		<MASTER_ITEM DESI_EN="ENSEMBLE 22 OF ITEM" CODE_AECMA="0123456654" ECHELON4M="Vrai" ECHELON1="Vrai">
    			<VERSION_ITEM NUMBER="321654" VERSION="A">
    				<CONCRETISATION QTE_TCI="1" ISN_AECMA="00A" CODE_OTAN_ART="MONENTREPRISE" REF_ARTICLE="4368972789">
    				</CONCRETISATION>
    			</VERSION_ITEM>
    		</MASTER_ITEM>
    		<REFER_TO_ITEM DESI_EN="RENVOI VERS UN ITEM" CODE_AECMA="7891234560" ECHELON4M="Vrai" ECHELON1="Vrai">
    			<VERSION_ITEM NUMBER="798465" VERSION="A">
    			</VERSION_ITEM>
    			<MASTER_ITEM DESI_EN="ENSEMBLE 31 OF ITEM" CODE_AECMA="0658527654" ECHELON4M="Faux" ECHELON1="Vrai">
    				<VERSION_ITEM NUMBER="741654" VERSION="A">
    					<CONCRETISATION QTE_TCI="1" ISN_AECMA="07A" CODE_OTAN_ART="MONENTREPRISE" REF_ARTICLE="4368995130">
    					</CONCRETISATION>
    				</VERSION_ITEM>
    			</MASTER_ITEM>
    			<MASTER_ITEM DESI_EN="ENSEMBLE 32 OF ITEM" CODE_AECMA="0123963654" ECHELON4M="Vrai" ECHELON1="Vrai">
    				<VERSION_ITEM NUMBER="321744" VERSION="B">
    					<CONCRETISATION QTE_TCI="1" ISN_AECMA="00B" CODE_OTAN_ART="MONENTREPRISE" REF_ARTICLE="4375372789">
    					</CONCRETISATION>
    				</VERSION_ITEM>
    			</MASTER_ITEM>
    		</REFER_TO_ITEM>
    	</MASTER_ITEM>
    </TETE_ITEM>
    Vous imaginez la tête d'un étudiant débutant en Perl face à un fichier ressemblant à ça et composé de 20000 lignes comme celles-ci...

    Et je suis conscient que recourir systématiquement aux regexp est une mauvaise habitude.

  9. #9
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    18 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 18 938
    Points : 495 362
    Points
    495 362

    Par défaut

    Bon,

    Ton XML est plutôt simple. Il n'y a pas de DTD ou XSD, même si c'est recommandé, pas grave du moment où tu connais bien la structure du fichier.

    Maintenant essaye de nous explique rce que tu souhaites extraire de façon précise.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2017
    Messages : 25
    Points : 11
    Points
    11

    Par défaut

    Citation Envoyé par djibril Voir le message
    Bon,

    Ton XML est plutôt simple. Il n'y a pas de DTD ou XSD, même si c'est recommandé, pas grave du moment où tu connais bien la structure du fichier.

    Maintenant essaye de nous explique rce que tu souhaites extraire de façon précise.
    Il faut que j'extraie les valeurs des attributs dans les balises puis que je les compare avec les valeurs d'un fichier xls pour lister les différences entre les items des 2 fichiers.

    Le code que j'ai fait avec els regexp fait ça :
    En gros, je reconstitue les items du XML et les mets dans un hash pour y accéder facilement.
    Et pour le XLS, je mets les attributs sous forme de liste et chaque liste va occuper une case d'un tableau (ce code a été écrit par un de mes collègues, je ne sait pas trop comment il marche).
    Ensuite, pour chaque item, je compare attribut à attribut et je mets dans un fichier resultat.txt les différences trouvées (par exemple: "Item id = blabla ERREUR : DESI_EN").

  11. #11
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    18 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 18 938
    Points : 495 362
    Points
    495 362

    Par défaut

    Ce n'est pas assez clair.
    Les attributs de tes balises n'ont pas des noms uniques, on a pas d'idées du contenu de ton xls. Bref, il faut des exemples.
    Pour parser le XML de la meilleure façon, il faut vraiment comprendre ce que tu compares, quoi, quand, à quel moment, dans quelle balise ou sous balise. Là tu donnes des généralités.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2017
    Messages : 25
    Points : 11
    Points
    11

    Par défaut

    Je ne comprends pas ce que tu veux dire par "ils n'ont pas de noms uniques"... Chaque MASTER_ITEM a les mêmes attributs, chaque VERSION_ITEM pareil etc, c'est juste les valeurs qui changent.

    Voici à quoi res
    CSN ISN PNR MFC DFP QNA DFL
    1234 00A 123 MONENTREPRISE toto 1
    4321 01B 321 MONENTREPRISE tutu 5 PRE-MOD C1234

    La comparaison se fait attribut à attribut pour chaque item.
    Pour donner un ID unique à un item, je concatène le CODE_AECMA avec le CSN et l'ISN_AECMA avec l'ISN. Ca me permet d'identifier les items et de voir si je tombe sur le même dans l'autre.

    Pour la comparaison (pour les noms, se reporter aux exemples xml et tableau qui représente xls) :
    CSN => CODE_AECMA
    ISN => ISN_AECMA
    PNR => REF_ARTICLE
    MFC => CODE_OTAN_ART
    DFP => DESI_EN
    QNA => QTE_TCI
    DFL => COMMENT_LABEL

  13. #13
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    18 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 18 938
    Points : 495 362
    Points
    495 362

    Par défaut

    Bonsoir,

    Les attributs que tu cherches dans le XML se trouvent dans les balises CONCRETISATION, LABEL, MASTER_ITEM...
    Lire ces attributs est très simple. Par contre à quoi correspond un ITEM pour toi ? Car il faut pouvoir savoir à quel moment faire les comparaisons. De plus, si tu dois les stocker en hash, qu'est-ce que tu utilises comme clé de HASH ?

    Voici un programme basique pour te montrer facilement ce que tu peux faire :
    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
    #!/usr/bin/perl
    use strict;
    use warnings;
    use XML::Twig;
     
    my $FichierXML = 'test.xml';
     
    # Parsing façon intelligente en ne chargeant que le strict nécessaire en mémoire
    # Utilisation des handlers
    my $twig = new XML::Twig(
    	Twig_handlers => {
    		'TETE_ITEM'      => \&test,
    		'CONCRETISATION' => \&test,
    		'LABEL'          => \&test,
    		'MASTER_ITEM'    => \&test,
     
    	},
    );
     
    # Création d'un objet twig
    $twig->parsefile($FichierXML);
     
    sub test {
    	my ( $twig, $twig_balise ) = @_;
     
    	foreach my $nom_attribut ( $twig_balise->att_names() ) {
    		print "Nom attribut : $nom_attribut\n";
    		print "Valeur attribut : ", $twig_balise->att($nom_attribut), "\n";
    	}
    }
    Résultat :

    Code texte : 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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    Nom attribut : CODE_OTAN_ART
    Valeur attribut : MONENTREPRISE
    Nom attribut : ISN_AECMA
    Valeur attribut : 00A
    Nom attribut : QTE_TCI
    Valeur attribut : 1
    Nom attribut : REF_ARTICLE
    Valeur attribut : 9876543210
    Nom attribut : COMMENT_LABEL
    Valeur attribut : Post MOD C12341
    Nom attribut : CODE_OTAN_ART
    Valeur attribut : MONENTREPRISE
    Nom attribut : ISN_AECMA
    Valeur attribut : 00B
    Nom attribut : QTE_TCI
    Valeur attribut : 1
    Nom attribut : REF_ARTICLE
    Valeur attribut : 0123456789
    Nom attribut : CODE_OTAN_ART
    Valeur attribut : PRESTATAIRE
    Nom attribut : ISN_AECMA
    Valeur attribut : 00A
    Nom attribut : QTE_TCI
    Valeur attribut : 1
    Nom attribut : REF_ARTICLE
    Valeur attribut : 4567891230
    Nom attribut : CODE_AECMA
    Valeur attribut : 21987654321
    Nom attribut : DESI_EN
    Valeur attribut : PART 1 OF ITEM
    Nom attribut : ECHELON1
    Valeur attribut : Vrai
    Nom attribut : ECHELON4M
    Valeur attribut : Faux
    Nom attribut : CODE_OTAN_ART
    Valeur attribut : AUTREENTREPRISE
    Nom attribut : ISN_AECMA
    Valeur attribut : 00A
    Nom attribut : QTE_TCI
    Valeur attribut : 1
    Nom attribut : REF_ARTICLE
    Valeur attribut : 5358912730
    Nom attribut : COMMENT_LABEL
    Valeur attribut : Post MOD C12344
    Nom attribut : COMMENT_LABEL
    Valeur attribut : Pre MOD C12345
    Nom attribut : CODE_OTAN_ART
    Valeur attribut : AUTREENTREPRISE
    Nom attribut : ISN_AECMA
    Valeur attribut : 01B
    Nom attribut : QTE_TCI
    Valeur attribut : 1
    Nom attribut : REF_ARTICLE
    Valeur attribut : 4368912730
    Nom attribut : CODE_OTAN_ART
    Valeur attribut : MONENTREPRISE
    Nom attribut : ISN_AECMA
    Valeur attribut : 07A
    Nom attribut : QTE_TCI
    Valeur attribut : 1
    Nom attribut : REF_ARTICLE
    Valeur attribut : 4368972130
    Nom attribut : CODE_AECMA
    Valeur attribut : 0657987654
    Nom attribut : DESI_EN
    Valeur attribut : ENSEMBLE 21 OF ITEM
    Nom attribut : ECHELON1
    Valeur attribut : Vrai
    Nom attribut : ECHELON4M
    Valeur attribut : Faux
    Nom attribut : CODE_OTAN_ART
    Valeur attribut : MONENTREPRISE
    Nom attribut : ISN_AECMA
    Valeur attribut : 00A
    Nom attribut : QTE_TCI
    Valeur attribut : 1
    Nom attribut : REF_ARTICLE
    Valeur attribut : 4368972789
    Nom attribut : CODE_AECMA
    Valeur attribut : 0123456654
    Nom attribut : DESI_EN
    Valeur attribut : ENSEMBLE 22 OF ITEM
    Nom attribut : ECHELON1
    Valeur attribut : Vrai
    Nom attribut : ECHELON4M
    Valeur attribut : Vrai
    Nom attribut : CODE_OTAN_ART
    Valeur attribut : MONENTREPRISE
    Nom attribut : ISN_AECMA
    Valeur attribut : 07A
    Nom attribut : QTE_TCI
    Valeur attribut : 1
    Nom attribut : REF_ARTICLE
    Valeur attribut : 4368995130
    Nom attribut : CODE_AECMA
    Valeur attribut : 0658527654
    Nom attribut : DESI_EN
    Valeur attribut : ENSEMBLE 31 OF ITEM
    Nom attribut : ECHELON1
    Valeur attribut : Vrai
    Nom attribut : ECHELON4M
    Valeur attribut : Faux
    Nom attribut : CODE_OTAN_ART
    Valeur attribut : MONENTREPRISE
    Nom attribut : ISN_AECMA
    Valeur attribut : 00B
    Nom attribut : QTE_TCI
    Valeur attribut : 1
    Nom attribut : REF_ARTICLE
    Valeur attribut : 4375372789
    Nom attribut : CODE_AECMA
    Valeur attribut : 0123963654
    Nom attribut : DESI_EN
    Valeur attribut : ENSEMBLE 32 OF ITEM
    Nom attribut : ECHELON1
    Valeur attribut : Vrai
    Nom attribut : ECHELON4M
    Valeur attribut : Vrai
    Nom attribut : CODE_AECMA
    Valeur attribut : 0123987654
    Nom attribut : DESI_EN
    Valeur attribut : ENSEMBLE 2 OF ITEM
    Nom attribut : ECHELON1
    Valeur attribut : Vrai
    Nom attribut : ECHELON4M
    Valeur attribut : Faux
    Nom attribut : CODE_AECMA
    Valeur attribut : 12345678912
    Nom attribut : DESI_EN
    Valeur attribut : ITEM
    Nom attribut : ECHELON1
    Valeur attribut : Vrai
    Nom attribut : ECHELON4M
    Valeur attribut : Vrai

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2017
    Messages : 25
    Points : 11
    Points
    11

    Par défaut

    Citation Envoyé par djibril Voir le message
    Bonsoir,

    Les attributs que tu cherches dans le XML se trouvent dans les balises CONCRETISATION, LABEL, MASTER_ITEM...
    Lire ces attributs est très simple. Par contre à quoi correspond un ITEM pour toi ? Car il faut pouvoir savoir à quel moment faire les comparaisons. De plus, si tu dois les stocker en hash, qu'est-ce que tu utilises comme clé de HASH ?

    Voici un programme basique pour te montrer facilement ce que tu peux faire :
    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
    #!/usr/bin/perl
    use strict;
    use warnings;
    use XML::Twig;
     
    my $FichierXML = 'test.xml';
     
    # Parsing façon intelligente en ne chargeant que le strict nécessaire en mémoire
    # Utilisation des handlers
    my $twig = new XML::Twig(
    	Twig_handlers => {
    		'TETE_ITEM'      => \&test,
    		'CONCRETISATION' => \&test,
    		'LABEL'          => \&test,
    		'MASTER_ITEM'    => \&test,
     
    	},
    );
     
    # Création d'un objet twig
    $twig->parsefile($FichierXML);
     
    sub test {
    	my ( $twig, $twig_balise ) = @_;
     
    	foreach my $nom_attribut ( $twig_balise->att_names() ) {
    		print "Nom attribut : $nom_attribut\n";
    		print "Valeur attribut : ", $twig_balise->att($nom_attribut), "\n";
    	}
    }
    Résultat :

    Code texte : 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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    Nom attribut : CODE_OTAN_ART
    Valeur attribut : MONENTREPRISE
    Nom attribut : ISN_AECMA
    Valeur attribut : 00A
    Nom attribut : QTE_TCI
    Valeur attribut : 1
    Nom attribut : REF_ARTICLE
    Valeur attribut : 9876543210
    Nom attribut : COMMENT_LABEL
    Valeur attribut : Post MOD C12341
    Nom attribut : CODE_OTAN_ART
    Valeur attribut : MONENTREPRISE
    Nom attribut : ISN_AECMA
    Valeur attribut : 00B
    Nom attribut : QTE_TCI
    Valeur attribut : 1
    Nom attribut : REF_ARTICLE
    Valeur attribut : 0123456789
    Nom attribut : CODE_OTAN_ART
    Valeur attribut : PRESTATAIRE
    Nom attribut : ISN_AECMA
    Valeur attribut : 00A
    Nom attribut : QTE_TCI
    Valeur attribut : 1
    Nom attribut : REF_ARTICLE
    Valeur attribut : 4567891230
    Nom attribut : CODE_AECMA
    Valeur attribut : 21987654321
    Nom attribut : DESI_EN
    Valeur attribut : PART 1 OF ITEM
    Nom attribut : ECHELON1
    Valeur attribut : Vrai
    Nom attribut : ECHELON4M
    Valeur attribut : Faux
    Nom attribut : CODE_OTAN_ART
    Valeur attribut : AUTREENTREPRISE
    Nom attribut : ISN_AECMA
    Valeur attribut : 00A
    Nom attribut : QTE_TCI
    Valeur attribut : 1
    Nom attribut : REF_ARTICLE
    Valeur attribut : 5358912730
    Nom attribut : COMMENT_LABEL
    Valeur attribut : Post MOD C12344
    Nom attribut : COMMENT_LABEL
    Valeur attribut : Pre MOD C12345
    Nom attribut : CODE_OTAN_ART
    Valeur attribut : AUTREENTREPRISE
    Nom attribut : ISN_AECMA
    Valeur attribut : 01B
    Nom attribut : QTE_TCI
    Valeur attribut : 1
    Nom attribut : REF_ARTICLE
    Valeur attribut : 4368912730
    Nom attribut : CODE_OTAN_ART
    Valeur attribut : MONENTREPRISE
    Nom attribut : ISN_AECMA
    Valeur attribut : 07A
    Nom attribut : QTE_TCI
    Valeur attribut : 1
    Nom attribut : REF_ARTICLE
    Valeur attribut : 4368972130
    Nom attribut : CODE_AECMA
    Valeur attribut : 0657987654
    Nom attribut : DESI_EN
    Valeur attribut : ENSEMBLE 21 OF ITEM
    Nom attribut : ECHELON1
    Valeur attribut : Vrai
    Nom attribut : ECHELON4M
    Valeur attribut : Faux
    Nom attribut : CODE_OTAN_ART
    Valeur attribut : MONENTREPRISE
    Nom attribut : ISN_AECMA
    Valeur attribut : 00A
    Nom attribut : QTE_TCI
    Valeur attribut : 1
    Nom attribut : REF_ARTICLE
    Valeur attribut : 4368972789
    Nom attribut : CODE_AECMA
    Valeur attribut : 0123456654
    Nom attribut : DESI_EN
    Valeur attribut : ENSEMBLE 22 OF ITEM
    Nom attribut : ECHELON1
    Valeur attribut : Vrai
    Nom attribut : ECHELON4M
    Valeur attribut : Vrai
    Nom attribut : CODE_OTAN_ART
    Valeur attribut : MONENTREPRISE
    Nom attribut : ISN_AECMA
    Valeur attribut : 07A
    Nom attribut : QTE_TCI
    Valeur attribut : 1
    Nom attribut : REF_ARTICLE
    Valeur attribut : 4368995130
    Nom attribut : CODE_AECMA
    Valeur attribut : 0658527654
    Nom attribut : DESI_EN
    Valeur attribut : ENSEMBLE 31 OF ITEM
    Nom attribut : ECHELON1
    Valeur attribut : Vrai
    Nom attribut : ECHELON4M
    Valeur attribut : Faux
    Nom attribut : CODE_OTAN_ART
    Valeur attribut : MONENTREPRISE
    Nom attribut : ISN_AECMA
    Valeur attribut : 00B
    Nom attribut : QTE_TCI
    Valeur attribut : 1
    Nom attribut : REF_ARTICLE
    Valeur attribut : 4375372789
    Nom attribut : CODE_AECMA
    Valeur attribut : 0123963654
    Nom attribut : DESI_EN
    Valeur attribut : ENSEMBLE 32 OF ITEM
    Nom attribut : ECHELON1
    Valeur attribut : Vrai
    Nom attribut : ECHELON4M
    Valeur attribut : Vrai
    Nom attribut : CODE_AECMA
    Valeur attribut : 0123987654
    Nom attribut : DESI_EN
    Valeur attribut : ENSEMBLE 2 OF ITEM
    Nom attribut : ECHELON1
    Valeur attribut : Vrai
    Nom attribut : ECHELON4M
    Valeur attribut : Faux
    Nom attribut : CODE_AECMA
    Valeur attribut : 12345678912
    Nom attribut : DESI_EN
    Valeur attribut : ITEM
    Nom attribut : ECHELON1
    Valeur attribut : Vrai
    Nom attribut : ECHELON4M
    Valeur attribut : Vrai
    Salut,

    La clef de hash serait l'ID unique dont je parlais plus haut, de sorte que l'écriture dans le hash se fait ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $donnees{$id_unique}{REF_ARTICLE} = $ref_article;
    Et un item est composé d'un master_item, d'une version_item d'une concretisation et éventuellement d'un label s'il y en a (je cherche à ce que 2 labels pour le même item soient considérés comme 2 items chacun avec son label).
    L'idéal serait que le tete_item soit considéré/traité comme un master_item, je ne sais pas si c'est faisable.

    Je vais me relire ton cours sur twig, je ne comprends pas bien ton code.

    Quant à la question "Quand effectuer la comparaison ?", j'avais mis dans les spécifs (sur lesquelles je ne peux bien évidemment pas revenir) que les 2 fichiers seraient chargés dans des structures de données Perl et que la comparaison aurait lieu après, plutôt que de la faire à la volée. Le résultat de la comparaison sera alors écrit dans un fichier resultat.txt qui listera les différences entre les items à raison d'une différence par ligne.

  15. #15
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2017
    Messages : 25
    Points : 11
    Points
    11

    Par défaut

    Il me semble selon ce que dit cette page : http://xmltwig.org/xmltwig/quick_ref.html qu'il est possible depuis un enfant d'attraper le parent, ai-je bien compris?
    Parce que si c'est le cas, Twig est plus simple à utiliser que ce que j'avais compris...
    Il me suffirait alors de me positionner sur une concretisation puis d'attraper le grand-parent (master_item) puis faire un foreach pour chaque label pour reconstituer chaque item, non?

  16. #16
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    18 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 18 938
    Points : 495 362
    Points
    495 362

    Par défaut

    Twig te permet de lire les parents, grand-père ancêtre... bref, tu peux aller dans tous les sens. D'où l'intérêt de bien réfléchir en amont de ce qu'il y a à faire pour procéder au parsing de la bonne manière.

  17. #17
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2017
    Messages : 25
    Points : 11
    Points
    11

    Par défaut

    Citation Envoyé par djibril Voir le message
    Twig te permet de lire les parents, grand-père ancêtre... bref, tu peux aller dans tous les sens. D'où l'intérêt de bien réfléchir en amont de ce qu'il y a à faire pour procéder au parsing de la bonne manière.
    Très bien, je vais essayer de plancher dessus, je verrai bien ce que j'arriverai à faire.

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

Discussions similaires

  1. [debutant] question sur la surcharge des operateurs
    Par hunter99 dans le forum Débuter
    Réponses: 17
    Dernier message: 04/01/2008, 18h26
  2. [Debutant] Question sur le system.out.print
    Par thom02 dans le forum Langage
    Réponses: 8
    Dernier message: 19/07/2005, 18h19
  3. Requete sur des fichiers XML
    Par buildit dans le forum XML
    Réponses: 1
    Dernier message: 10/05/2005, 10h57
  4. [debutant] Questions a propos du XML
    Par brune dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 04/06/2004, 09h39
  5. [debutant] Questions sur 1 futur projet
    Par cyrull22 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 28/04/2003, 21h49

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