Pergunta

Estou tendo problemas para entender / usar espaços de nomes com Xml :: libxml Pacote em Perl. Posso acessar um elemento com sucesso, mas não um atributo. Eu tenho o seguinte código que acessa um arquivo 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');   

Em seguida, tento acessar um elemento chamado Nome Comum e um atributo chamado Name.

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" ;
}

Mas apenas o nome latino (@name) está imprimindo, o nome comum não é. O que estou fazendo de errado e como posso imprimir o nome comum?

O que o @Name faz neste caso? Presumo que seja uma matriz, e que os atributos devem ser colocados em uma matriz, pois pode haver mais de um, mas elementos (como o nome comum) não devem ser porque deve haver apenas um?

Eu tenho seguido os exemplos aqui: http://www.xml.com/pub/a/2001/11/14/xml-libxml.htmle aqui: http://perl-xml.sourceforge.net/faq/#namespaces_xpath, e tentando fazer com que o script de camelos de exemplo trabalhe com meu espaço para nome, daí o espaço de nome estranho.

Foi útil?

Solução

Verifique se o arquivo XML é válido e use $node->getAttribute("someAttribute") para acessar atributos.

@Name é um nome de atributo. Você o usaria em findNodes () para especificar elementos com um determinado conjunto de atributos. Por exemplo. Um caminho como:

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

Aqui está um exemplo simples/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";
    }
}

A saída é:

perl ./xmltest.pl 
A: Camelus bactrianus
B: common-name = Bactrian Camel
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top