XML Simple et les deux points
Le
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
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

Poser une question


Ericus
"... 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 - Perl en français -
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
;-)
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é.
Ericus
Via CPAN comme d'habitude...
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.
Ç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 - Perl en français -
"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
Ericus
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 - Perl en français -