Domanda

Ho difficoltà a capire / usare spazi di nome con XML :: libxml pacchetto in perl. Posso accedere a un elemento correttamente ma non un attributo. Ho il seguente codice che accede a un file 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');   

Quindi provo ad accedere a un elemento chiamato nome comune e un attributo chiamato nome.

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

Ma solo il nome latino (@name) sta stampando, il nome comune non lo è. Cosa sto facendo di sbagliato e come posso far stampare anche il nome comune?

Cosa fa il @Name in questo caso? Presumo che sia un array e che gli attributi dovrebbero essere messi in un array in quanto può essercene più di uno, ma gli elementi (come il nome comune) non dovrebbero essere perché dovrebbe esserci solo uno?

Ho seguito gli esempi qui: http://www.xml.com/pub/a/2001/11/14/xml-libxml.htmle qui: http://perl-xml.sourceforge.net/faq/#namespaces_xpath, e cercando di far funzionare il loro script di cammello con il mio spazio dei nomi, da cui lo spazio dei nomi strani.

È stato utile?

Soluzione

Assicurati che il tuo file XML sia valido, quindi utilizza $node->getAttribute("someAttribute") Per accedere agli attributi.

@Name è un nome attributo. Lo useresti in FindNodes () per specificare elementi con un determinato set di attributi. Per esempio. un percorso come:

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

Ecco un esempio semplice/inventato:

#!/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";
    }
}

L'output è:

perl ./xmltest.pl 
A: Camelus bactrianus
B: common-name = Bactrian Camel
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top