OVH Cloud OVH Cloud

XML Simple et les deux points

7 réponses
Avatar
Ericus
Salut
j'ai écrit un script pour extraire des données du fichier XML de gnucash
(pour tracer des courbes de court d'actions).
j'ai utilisé XML::Simple pour lire le fichier.

çà marchait très bien depuis plusieurs années et depuis quelques temps
(probablement au passage de la mandraque 10.0 à 10.1) çà ne fonctionne plus
et j'ai l'erreur suivante :

"Undeclared prefix: cd at
/usr/lib/perl5/vendor_perl/5.8.1/XML/NamespaceSupport.pm line 293."

J'ai cherché un peu et j'ai vu que le ":" posait quelques problèmes :
le script qui suit génère bien le fichier xml mais plante à la lecture :
#!/usr/bin/perl
use XML::Simple;
use Data::Dumper;

$xml = new XML::Simple;
$data{'toto:titi'}='toto';
$ref = \%data;
$xml->XMLout($ref, outputfile => 'test.xml');
$data = $xml->XMLin("test.xml");
print Dumper($data);

si je suprime le ":" entre toto et titi, il n'y a pas d'erreur.

j'ai regardé dans la doc et c'est indiqué qu'on peut utiliser les ":" sans
problème si on utilise XML::SAX ce qui semble être mon cas.

L'impression que j'ai est que le ":" est interprété comme un séparateur...

maintenant je suis un peu sec ....

merci de votre aide
Eric
--
Apprendre a mourir ! Et pourquoi donc ?
On y réussit très bien la première fois !
Chamfort

7 réponses

Avatar
Paul Gaborit
À (at) Sun, 16 Jan 2005 22:16:32 +0100,
Ericus écrivait (wrote):
j'ai regardé dans la doc et c'est indiqué qu'on peut utiliser les ":" sans
problème si on utilise XML::SAX ce qui semble être mon cas.


"... ce qui semble être [votre] cas." ?

Pour en être sûr, ajoutez la ligne suivante dans votre script :

use XML::SAX;

Si il accepte de se compiler alors, oui, XML::Simple peut utiliser XML::SAX.

Votre exemple de code fonctionne très bien ici.

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>

Avatar
Ericus
bonjour


"... ce qui semble être [votre] cas." ?

Pour en être sûr, ajoutez la ligne suivante dans votre script :

use XML::SAX;

Si il accepte de se compiler alors, oui, XML::Simple peut utiliser
XML::SAX.


j'ai déjà testé cette ligne et j'ai même désinstallé XML::Parser pour être
sûr du coup. c'est ok
c'est vrai que j'aurais du être plus afirmatif mais ...
avec l'expérience .... je me montre prudent dans mes afirmations
;-)


Votre exemple de code fonctionne très bien ici.

aie !


comment avez vous installé XML::Simple et XML::SAX ?

j'utilise des packetages rpm qui font partie de la distrib Mandrake 10.1

ma version XML:SAX : 0.12 ( bizarre non ?)
ma version XML: Simple : 2.12

est-ce qu'il y a des options de compilations ou un paramètrage qui pourrait
donner ce fonctionnement particulier ?

à+
Eric
--
Selon la loi n°91.32 : Fumer nuit gravement à la santé.

Avatar
Paul Gaborit
À (at) Mon, 17 Jan 2005 19:56:38 +0100,
Ericus écrivait (wrote):
comment avez vous installé XML::Simple et XML::SAX ?


Via CPAN comme d'habitude...

j'utilise des packetages rpm qui font partie de la distrib Mandrake 10.1

ma version XML:SAX : 0.12 ( bizarre non ?)
ma version XML: Simple : 2.12


Ok pour XML::SAX (le dernière version est bien la 0.12). Ma version de
XML::Simple est la 2.13 mais je ne pense pas que ça joue.

est-ce qu'il y a des options de compilations ou un paramètrage qui pourrait
donner ce fonctionnement particulier ?


Ça ne peut pas être les options de compilation ni de paramètrage... Par
contre, ce petit extrait de la documentation de XML::Simple donne peut-être
une piste :

«... To generate documents with namespaces, XML::NamespaceSupport is
required. ... »

Est-ce que XML::NamespaceSupport est installé chez vous ?

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>

Avatar
Ericus
bonjour


Ça ne peut pas être les options de compilation ni de paramètrage... Par
contre, ce petit extrait de la documentation de XML::Simple donne
peut-être une piste :

«... To generate documents with namespaces, XML::NamespaceSupport
is required. ... »

Est-ce que XML::NamespaceSupport est installé chez vous ?

oui, d'ailleurs c'est lui qui renvoie l'erreur :


"Undeclared prefix: cd
at /usr/lib/perl5/vendor_perl/5.8.1/XML/NamespaceSupport.pm line 293."

j'ai regardé dans NamespaceSupport.pm, voilà la fonction qui renvoie
l'erreur :

sub _get_ns_details {
my $self = shift;
my $qname = shift;
my $aflag = shift;
my ($ns, $prefix, $lname);
(my ($tmp_prefix, $tmp_lname) = split /:/, $qname, 3)
< 3 or die "Invalid QName: $qname";
# no prefix
my $cur_map = $self->[NSMAP]->[-1];
if (not defined($tmp_lname)) {
$prefix = undef;
$lname = $qname;
# attr don't have a default namespace
$ns = ($aflag) ? undef : $cur_map->[DEFAULT];
}
# prefix
else {
if (exists $cur_map->[PREFIX_MAP]->{$tmp_prefix}) {
$prefix = $tmp_prefix;
$lname = $tmp_lname;
$ns = $cur_map->[PREFIX_MAP]->{$prefix}
}
else { # no ns -> lname == name, all rest undef
die "Undeclared prefix: $tmp_prefix"; ==>> cette ligne génère
l'erreur
}
}

return ($ns, $prefix, $lname);
}

je vois au début qu'il fait un split avec un séparateur ":"
mais j'ai du mal à comprendre la programmation objet ....
j'ai regardé la documentation de XML:NamespaceSupport et je n'ai rien vu de
particulier ...

à+
Eric
--
Deux coqs vivaient en paix ; une poule survint...
Jean de La Fontaine

Avatar
Paul Gaborit
À (at) Tue, 18 Jan 2005 21:32:06 +0100,
Ericus écrivait (wrote):
oui, d'ailleurs c'est lui qui renvoie l'erreur :

"Undeclared prefix: cd
at /usr/lib/perl5/vendor_perl/5.8.1/XML/NamespaceSupport.pm line 293."


Ce message ne provient pas de l'exécution de l'exemple que vous nous avez
posté... ou alors d'où vient le "cd" ?

Le problème ne viendrait-il tout simplement pas du fait que votre fichier XML
généré utilise un namespace non déclaré ?


--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>

Avatar
Ericus
bonjour



À (at) Tue, 18 Jan 2005 21:32:06 +0100,
Ericus écrivait (wrote):
oui, d'ailleurs c'est lui qui renvoie l'erreur :

"Undeclared prefix: cd
at /usr/lib/perl5/vendor_perl/5.8.1/XML/NamespaceSupport.pm line 293."


Ce message ne provient pas de l'exécution de l'exemple que vous nous avez
posté... ou alors d'où vient le "cd" ?


exact
ce message d'erreur correspond au fichier xml de gnucash dont voilà un
extrait :

<?xml version="1.0"?>
<gnc-v2>
<gnc:count-data cd:type="book">1</gnc:count-data>
<gnc:book version="2.0.0">
<book:id type="guid">545c76e421700067678f6fd41b2e7dd3</book:id>
<gnc:count-data cd:type="commodity">14</gnc:count-data>
<gnc:count-data cd:type="account">110</gnc:count-data>
<gnc:count-data cd:type="transaction">1354</gnc:count-data>
.....
</gnc:book>
</gnc-v2>


j'ai fait plusieurs essais pour isoler la 1ère ligne qui donne l'erreur, il
s'agit de :
<gnc:count-data cd:type="book">1</gnc:count-data>

ce qui est étonnant c'est qu'il ne donne pas d'erreur pour
gnc:count-data ....

voilà le message d'erreur retourné par l'exemple :
Undeclared prefix: toto
at /usr/lib/perl5/vendor_perl/5.8.1/XML/NamespaceSupport.pm line 293.

Le problème ne viendrait-il tout simplement pas du fait que votre fichier
XML généré utilise un namespace non déclaré ?


peut-être, (bien que je ne vois pas du tout comment déclarer un namespace)
mais je penche plutôt pour une config particulière ou une adaptation faite
par mandrake vu que pour vous le script d'exemple fonctionne ....
vous pouvez peut être essayer de traiter l'extrait de fichier ci-dessus et
voir si çà fonctionne chez vous

je vais essayer autre chose :
installer XML:Simple et XML:SAX depouis le CPAN
ou essayer avec une autre distrib, je voulais justement voir ce que donnait
la Suse

Merci
à+
Eric
--
L'ennemi est bête,
il croit que l'ennemi c'est nous,
alors que c'est lui.
Pierre Desproges.


Avatar
Ericus

Bonjour,


bonjour

$data{'toto:titi'}='toto';

si je suprime le ":" entre toto et titi, il n'y a pas d'erreur.

j'ai regardé dans la doc et c'est indiqué qu'on peut utiliser les ":"
sans problème si on utilise XML::SAX ce qui semble être mon cas.
L'impression que j'ai est que le ":" est interprété comme un
séparateur...


le ":" est un séparateur qui permet de différencier les espaces
d'utilisation ou contexte ( espace de nom ou Namespace en grand-breton )
d'un Element ou Attribute dans arbre XML.

ce séparateur est plus que nécessaire par exemple pour la génération de
documents xhtml qui contiennent leur RSS a l'intérieur.

un exemple est l'utilisation des données selon la langue avec un
document xhtml dans plusieurs langues.

je vous invite à lire la recommandation du W3C sur le sujet ou à poster
sur <news:fr.comp.text.xml>


je ne connaissais pas, je vais leur exposer mon problème


pour ce qui est de votre distribution linux, vous devez disposer d'un
gestionnaire de logiciels qui permet de telecharger et installer en
quelques clics le logiciel ou outil désiré.

Mandrake utilise urpmi en ligne de commande, et doit avoir un frontal
graphique. tout dispose comme debian, Mandrake dispose dans ses archives
d'une grande partie du CPAN installable automatiquement.


je connais bien urpmi.
XML:SAX est installé de base avec la mandrake et peut-être même XML:Simple
d'autre part je n'ai pas de message qui me dise qu'il manque un module perl

le truc bizarre c'est qu'un autre interlocuteur (Paul Gaborit) me dit qu'il
execute le script que j'ai donné sans erreur.
il a installé XML:Simple et XML:SAX depuis le cpan, je vais essayer aussi et
on verra ...

à+
Eric
--
PR: Le serveur (de news) de PacWan est en panne depuis le mois de juillet !
AT: A mon avis ils vont finir par s'en apercevoir, mais il risque de manquer
des articles.
-+- in: Guide du Cabaliste Usenet - La Cabale se propage (mal) -+-