2010-01-16 6 views
6

Tengo un archivo XML simple que se parece a esto:¿Qué pasa con esta declaración de findnodes en el script de mi 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> 

Estoy intentando leer los nombres de las especies con el siguiente 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'); 
    } 

Pero estoy de no poder conseguir encontrar ningún nodos. ¿Puedes ayudarme y decirme por qué no funciona, por favor? ¿Cuál es el mejor sitio web para buscar las funciones de Perl, así puedo probar y solucionar el problema yo mismo? ¿Cómo puedo obtener el script para decirme qué está haciendo, ya que el resultado en este momento no es nada? Muchas gracias.

Respuesta

5

Ha asociado un prefijo de espacio de nombre con el documento, pero su sintaxis XPath no lo usa.

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

debería hacer el trabajo.

Sin el prefijo no coincidirá. Además, la ruta */species solo coincidirá con los elementos secundarios en el contexto actual (es decir, el nivel superior del documento). Usando //species encontrará todos los elementos species en el documento. Si eso no funciona para usted (porque el elemento aparece en algún otro contexto en el documento no se desea hacer coincidir) utilizan

/*/*/ns:species 

como el elemento es un "gran nieto del nivel superior.

Una referencia más XPath.

+1

/ns: microplateDoc/ns: camélidos/ns: la especie también funcionaría por cierto ... –

Cuestiones relacionadas