2010-01-16 4 views
6

J'ai un simple fichier XML qui ressemble à ceci:Quel est le problème avec cette instruction findnodes dans mon script Perl?

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<microplateDoc xmlns="http://moleculardevices.com/microplateML"> 
<camelids> 
    <species name="Camelus bactrianus"> 
    <common-name>Bactrian Camel</common-name> 
    <physical-characteristics> 
     <mass>450 to 500 kg.</mass> 
     <appearance> 
    Blah blah blah 
    </appearance> 
    </physical-characteristics> 
    </species> 
    </camelids> 
</microplateDoc> 

Je suis en train de lire les noms des espèces avec le script Perl suivant:

use XML::LibXML; 

my $parser = XML::LibXML->new(); 
my $doc = $parser->parse_file('/Users/johncumbers/Documents/7_Scripts/Perl/XML_to_MySQL/simplified_camelids.xml'); 
my $xc = XML::LibXML::XPathContext->new($doc->documentElement() ); 
$xc->registerNs('ns', 'http://moleculardevices.com/microplateML'); 

#loop through to find species nodes 
my @n = $xc->findnodes('*/species'); #was */species 
foreach $nod (@n) { 
    print "A: ".$nod->getAttribute("name")."\n"; 
    my @c = $nod->findnodes('./common-name'); 
    } 

Mais je ne pas se trouver nœuds. Êtes-vous en mesure d'aider et de me dire pourquoi cela ne fonctionne pas s'il vous plaît? Quel est le meilleur site Web pour rechercher des fonctions de Perl afin que je puisse essayer et dépanner moi-même le problème? Comment puis-je obtenir le script pour me dire ce qu'il fait, comme la sortie pour le moment est juste rien. Merci beaucoup.

Répondre

5

Vous avez associé un préfixe d'espace de noms au document, mais votre syntaxe XPath ne l'utilise pas.

my @n = $xc->findnodes('//ns:species'); 

devrait faire le travail.

Sans le préfixe, vous ne correspondrez pas. De même, le chemin */species ne correspondra qu'aux enfants dans le contexte actuel (c'est-à-dire au niveau supérieur du document). En utilisant //species, vous trouverez tous les éléments species dans le document. Si cela ne fonctionne pas pour vous (parce que l'élément apparaît dans un autre contexte dans le document que vous ne voulez pas correspondre) utiliser

/*/*/ns:species 

que l'élément est un « grand petit-enfant » du niveau supérieur.

Une référence supplémentaire de.

+1

/ns: microplateDoc/ns: camelids/ns: l'espèce fonctionnerait trop bien ... –

Questions connexes