2010-01-16 4 views
6

Ho un semplice file XML che assomiglia a questo:Cosa c'è di sbagliato in questa dichiarazione di findnodes nello script di 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> 

Sto cercando di leggere i nomi delle specie con il seguente script Perl:

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'); 
    } 

Ma sto riuscendo a ottenere trovare qualsiasi i nodi. Sei in grado di aiutarti e dirmi perché non funziona, per favore? Qual è il miglior sito Web per cercare funzioni perl in modo che possa provare a risolvere questo problema personalmente? Come posso ottenere che la sceneggiatura mi dica cosa sta facendo, in quanto l'output al momento non è niente. Grazie molto.

risposta

5

È stato associato un prefisso del namespace al documento, ma la sintassi XPath non la utilizza.

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

dovrebbe fare il lavoro.

Senza il prefisso non corrisponderà. Anche il percorso */species corrisponderà solo ai bambini nel contesto corrente (ovvero il livello superiore del documento). L'utilizzo di //species troverà tutti gli elementi species nel documento. Se questo non funziona per voi (perché l'elemento appare in qualche altro contesto nel documento non si desidera far corrispondere) utilizzare

/*/*/ns:species 

come l'elemento è un 'pronipote' di livello superiore.

Un altro riferimento XPath.

+1

/ns: microplateDoc/ns: camelidi/ns: le specie funzionerebbero anche btw ... –