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

Modules Perl Discussion :

Perl + XML : problème de '-' avec XML::Simple


Sujet :

Modules Perl

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Perl + XML : problème de '-' avec XML::Simple
    Bonjour à tous

    J'ai un script perl à écrire, qui doit regarder le contenu d'un champ d'un fichier XML et effectuer une action en fonction de la valeur de ce champ.

    J'utilise pour cela le module XML::Simple.

    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
     
    #!/usr/local/bin/perl
     
    use strict;     #vérifie que toutes les variables sont bien déclarées avec my
    use Carp;       #Recherche les erreurs de syntaxe dans le programme
     
    use XML::Simple;
     
    my $xml = new XML::Simple (KeyAttr=>[]);
     
    my @liste_xml = glob('*-0000????.xml');
    my $count=0;
    for($count=0; $count <= $#liste_xml; $count++)
    {
    	my $data = $xml->XMLin(@liste_xml[$count]);
    	my $type;
    	if(ref($data->{utterance}) eq 'ARRAY')
    	{
    		$type=$data->{utterance}->[0]->{load}->{used-grammar};
    	}
    	else
    	{
    		$type=$data->{utterance}->{load}->{used-grammar};
    	}
    }
    Je cherche donc le contenu du champ 'used-grammar', mais le tiret pose apparement problème...

    Lorsque j'execute le script, voici les erreurs qui s'affichent :
    Bareword "used" not allowed while "strict subs" in use at transcription.pl line 30.
    Bareword "grammar" not allowed while "strict subs" in use at transcription.pl line 30.
    Bareword "used" not allowed while "strict subs" in use at transcription.pl line 34.
    Bareword "grammar" not allowed while "strict subs" in use at transcription.pl line 34.
    Execution of transcription.pl aborted due to compilation errors

    Voilà, si vous avez une idée...

    J'ai essayé en mettant guillemets, backslashes, un peu de tout autour de 'used-grammar' mais rien n'y fait. La recherche fonctionne correctement si le champ recherché n'a pas de tiret.


    Merci !

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    C'est simplement parce que tu ne peux utiliser la syntaxe $hash{key} que si key est un identifiant valide en Perl (autrement dit, s'il correspond à la regex : m/\A[a-z][a-z0-9_]*\Z/i). Sinon Perl essaie d'exécuter key comme une expression Perl normale. C'est ce qui te permet d'ailleurs de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for my $k (keys %hash) {
      print $hash{$k};
    }
    Et de ne pas imprimer la valeur associé à la clé '$k' (littéralement) dans $hash, mais bien celle associé à la clé $k (contenu de la variable).

    Donc, dans ton cas il faut que tu écrives une expression Perl valide qui renvoie la chaîne used-grammar, autrement dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	if(ref($data->{utterance}) eq 'ARRAY')
    	{
    		$type=$data->{utterance}->[0]->{load}->{'used-grammar'};
    	}
    	else
    	{
    		$type=$data->{utterance}->{load}->{'used-grammar'};
    	}
    --
    Jedaï

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    J'ai essayé en mettant guillemets, backslashes, un peu de tout autour de 'used-grammar' mais rien n'y fait.
    Donc ça marche pas mieu

    J'ai re-regardé dans la doc et eux font ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      print $catalog->{part}->{9344675}->{desc}, "\n";
    donc il n'y a pas de guillemets ni de quotes.

    Je laisse le lien de la doc si jamais quelqu'un a le courage d'y jeter un oeuil :
    http://search.cpan.org/dist/XML-Simp...Simple/FAQ.pod

    Avec des quotes autour de "used-grammar", il me renvoie ceci :
    Merci pour ton aide Jedai en tout cas !

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par rico29600
    Donc ça marche pas mieu
    Vraiment...

    Citation Envoyé par rico29600
    donc il n'y a pas de guillemets ni de quotes.
    Evidemment puisque les clés en questions sont simples et correspondent à un identifiant en Perl, sauf le nombre, mais avec lui il n'y a pas de problème de "bareword", on ne met pas de guillemets autour d'un nombre, même dans une expression Perl normale.

    Citation Envoyé par rico29600
    Avec des quotes autour de "used-grammar", il me renvoie ceci :
    C'est donc bien que ça fonctionne, et nettement mieux contrairement à ce que tu disais !!
    Le HASH(blabla) signifie que tu as imprimé une référence sur un hash, autrement dit l'information que tu cherches à afficher n'est pas directement sous "used-grammar" mais encore plus bas.

    --
    Jedaï

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <used-grammar key="tasr:/mrcp/00000001/[request1@form-level.store]#00000000" rule="" weight="1">
       <![CDATA[http://condor-qrt.acd33.cvf/CALHL/voicexml/grammar/Menu_Principal_HO.grxml]]>
    </used-grammar>
    Le champ que je cherche à récupérer est "<![CDATA[...]]>"
    Est-il reconnu comme une entrée XML normale ou le "!" pose t-il problème ?

    Merci

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Il faut donc regarder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	if(ref($data->{utterance}) eq 'ARRAY')
    	{
    		$type=$data->{utterance}[0]{load}{'used-grammar'}{content};
    	}
    	else
    	{
    		$type=$data->{utterance}{load}{'used-grammar'}{content};
    	}
    Pour obtenir le contenu de la balise used-grammar.

    --
    Jedaï

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    C'est bon je m'en suis sorti, le champ CDATA n'a pas été un problème, étant donné que XML::Simple met les données dans 'content'

    Merci pour l'aide Jedai !

    A+

Discussions similaires

  1. [Débutant] Problème application avec xml
    Par chneu87 dans le forum C#
    Réponses: 5
    Dernier message: 29/12/2011, 13h19
  2. [XML]Problème d'encodage XML avec un XmlTextWriter
    Par fragmonster dans le forum VB.NET
    Réponses: 0
    Dernier message: 15/09/2009, 10h28
  3. Problème incompréhensible avec XML
    Par poukill dans le forum C++
    Réponses: 5
    Dernier message: 18/07/2009, 06h36
  4. [c#/XML] Problème de sauvegarde XML
    Par Maldus dans le forum ASP.NET
    Réponses: 4
    Dernier message: 09/07/2008, 15h24
  5. Chat avec XML => Problème de rafraîchissement
    Par blanchonvincent dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 19/04/2008, 17h57

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