Frage

Ich habe Probleme, Namensräume zu verstehen / zu verwenden Xml :: libxml Paket in Perl. Ich kann erfolgreich, aber kein Attribut auf ein Element zugreifen. Ich habe den folgenden Code, der auf eine XML -Datei zugreift (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');   

Ich versuche dann, auf ein Element namens Common Namle und ein Attribut namens Name zuzugreifen.

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

Aber nur der lateinamerikanische Name (@name) druckt aus, der gemeinsame Namen ist nicht. Was mache ich falsch und wie kann ich auch den gemeinsamen Namen zum Ausdruck bringen?

Was macht der @Name in diesem Fall? Ich nehme an, es ist ein Array, und diese Attribute sollten in ein Array gesteckt werden, da es mehr als eine geben kann, aber Elemente (wie allgemeiner Name) sollten nicht darauf bestehen, dass es nur eines geben sollte?

Ich habe hier die Beispiele verfolgt: http://www.xml.com/pub/a/2001/11/14/xml-libxml.htmlund hier: http://perl-xml.sourceforge.net/faq/#namespaces_xpath, und versuchen, ihr Beispiel -Camel -Skript mit meinem Namespace zu bearbeiten, daher der seltsame Namespace.

War es hilfreich?

Lösung

Stellen Sie sicher, dass Sie die XML -Datei gültig sind und dann verwenden und dann verwenden $node->getAttribute("someAttribute") Zu den Zugang zu Attributen.

@Name ist ein Attributname. Sie würden es in FindNodes () verwenden, um Elemente mit einem bestimmten Attributsatz anzugeben. Z.B. Ein Weg wie:

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

Hier ist ein einfaches/erfundenes Beispiel:

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

Ausgabe ist:

perl ./xmltest.pl 
A: Camelus bactrianus
B: common-name = Bactrian Camel
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top