[Perl] Difficulté avec la méthode findnodes de XML::LibXML::Node
Dominique Asselineau
asseline at telecom-paristech.fr
Jeu 23 Mar 12:04:37 CET 2017
Sébastien Aperghis-Tramoni wrote on Wed, Mar 22, 2017 at 01:26:54AM +0100
> Dominique Asselineau a écrit :
>
> > Bonjour,
> >
> > La méthode findnodes du module XML::LibXML::Node demande un chemin
> > qui doit être préfixé par un NameSpace. Connaîtriez-vous le moyen
> > de savoir les NameSpaces disponibles au moment d'exécuter cette
> > méthode ? Je l'ai pourtant utilisée par ailleurs sans difficulté
> > mais cette fois, je suis bloqué. Il s'agit du format TEI.
>
> Pas testée, mais une solution peut être de trouver tous les espaces
> de noms déclarés jusqu'au nœud en question. Il ne semble pas y avoir
> de solution toute faite pour cela, et il faut visiblement remonter
> la hiérarchie en partant du nœud à coup de ->parentNode(), et à chaque
> nœud utiliser la méthode getNamespaces() qui renvoie la liste des
> espaces de nom déclarés à ce nœud :
>
> for my $ns ($node->getNamespaces) {
> say "- ", $ns->declaredPrefix, ": ", $ns->declaredURI;
> }
>
> Tu accumules les NS dans un tableau ou un hash, en remontant jusqu'à
> la racine du document ($dom->documentElement), moment où tu as toutes
> les déclarations d'espaces de nom qui s'appliquent au nœud de départ.
Merci pour la solution qui donne un résultat mais pas celui attendu.
Parmi ces résultats on a un espace de nom vide, c'est peut-être ça qui
pose problème. Du coup je m'en suis remis à la doc de
XML::LibXML::Node à propos de findnodes et j'ai exploité les notes
afin de forcer un nom d'espace à l'aide du module
XML::LibXML::XPathContext. C'est un peu lourd mais au moins ça
marche.
Dominique
--
Plus d'informations sur la liste de diffusion Perl