Question

J'ai du mal à comprendre / utiliser des espaces avec Xml :: libxml package en perl. Je peux accéder à un élément avec succès mais pas un attribut. J'ai le code suivant qui accède à un fichier 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');   

J'essaie ensuite d'accéder à un élément appelé nom commun et un attribut appelé nom.

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

Mais seulement le nom de latin (@name) imprime, le nom commun ne l'est pas. Qu'est-ce que je fais de mal et comment puis-je faire imprimer le nom commun?

Que fait le @name dans ce cas? Je suppose qu'il s'agit d'un tableau, et que les attributs doivent être placés dans un tableau car il peut y en avoir plus, mais des éléments (comme le nom commun) ne devraient pas l'être parce qu'il devrait y en avoir un?

J'ai suivi les exemples ici: http://www.xml.com/pub/a/2001/11/14/xml-libxml.htmlet ici: http://perl-xml.sourceforge.net/faq/#namespaces_xpath, et essayant d'obtenir leur exemple de script de chameau fonctionnant avec mon espace de noms, d'où l'espace de noms étrange.

Était-ce utile?

La solution

Assurez-vous que votre fichier XML est valide puis utilisez $node->getAttribute("someAttribute") pour accéder aux attributs.

@Name est un nom d'attribut. Vous l'utilisez dans findNodes () pour spécifier des éléments avec un ensemble d'attribut donné. Par exemple. Un chemin comme:

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

Voici un exemple simple / artificiel:

#!/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 sortie est:

perl ./xmltest.pl 
A: Camelus bactrianus
B: common-name = Bactrian Camel
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top