[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