Pregunta

Tengo problemas para comprender / usar espacios de nombre con Xml :: libxml Paquete en Perl. Puedo acceder a un elemento con éxito pero no un atributo. Tengo el siguiente código que accede a un archivo XML (http://pastebin.com/f3fb9d1d0).

my $tree = $parser->parse_file($file); # parses the file contents into the new libXML object.
my $xpc = XML::LibXML::XPathContext->new($tree); 
$xpc->registerNs(microplateML => 'http://moleculardevices.com/microplateML');   

Luego trato de acceder a un elemento llamado nombre de nombre común y un atributo llamado nombre.

foreach my $camelid ($xpc->findnodes('//microplateML:species')) {
  my $latin_name = $camelid->findvalue('@name');   
  my $common_name = $camelid->findvalue('common-name');  
  print "$latin_name, $common_name" ;
}

Pero solo el nombre latino (@name) está imprimiendo, el nombre común no lo es. ¿Qué estoy haciendo mal y cómo puedo hacer que el nombre común también imprima?

¿Qué hace el @name en este caso? Supongo que es una matriz, y que los atributos deben ponerse en una matriz, ya que puede haber más de uno, pero los elementos (como el nombre común) no deberían haberlo porque debería haber uno?

He estado siguiendo los ejemplos aquí: http://www.xml.com/pub/a/2001/11/14/xml-libxml.htmly aquí: http://perl-xml.sourceforge.net/faq/#namespaces_xpath, y tratando de hacer que su guión Camel de ejemplo funcione con mi espacio de nombres, de ahí el extraño espacio de nombres.

¿Fue útil?

Solución

Asegúrese de que el archivo XML sea válido y luego use $node->getAttribute("someAttribute") Para acceder a los atributos.

@Name es un nombre de atributo. Lo usaría en FindNodes () para especificar elementos con un conjunto de atributos dado. P.ej. un camino como:

//camelids/species[@name="Camelus bactrianus"]/

Aquí hay un ejemplo simple/artificial:

#!/usr/bin/perl -w
use XML::LibXML;

my $parser = XML::LibXML->new();
my $doc = $parser->parse_file('/Users/castle/Desktop/animal.xml');

my $xc = XML::LibXML::XPathContext->new( $doc->documentElement()  );
$xc->registerNs('ns', 'http://moleculardevices.com/microplateML');

my @n = $xc->findnodes('//ns:species');
foreach $nod (@n) {
    print "A: ".$nod->getAttribute("name")."\n";

    my @c = $xc->findnodes("./ns:common-name", $nod);
    foreach $cod (@c) {
        print "B: ".$cod->nodeName;
        print " = ";
        print $cod->getFirstChild()->getData()."\n";
    }
}

La salida es:

perl ./xmltest.pl 
A: Camelus bactrianus
B: common-name = Bactrian Camel
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top