Wie kann ich den Zugriff auf Attribute und Elemente von XML::LibXML Perl?
Ich habe Schwierigkeiten zu verstehen /Verwendung von name spaces mit XML::LibXML Paket in Perl. Ich kann auf ein element erfolgreich, aber kein Attribut. Ich habe folgenden code, welcher auf eine XML-Datei (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 dann versuchen, Zugriff auf ein element mit der Bezeichnung common-name und ein Attribut mit dem Namen 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" ;
}
Aber nur die lateinischen Namen (@name
) ausgedruckt werden, der gemeinsame name nicht. Was mache ich falsch und wie bekomme ich den common-name drucken?
Was bedeutet das @ - Namen in diesem Fall zu tun? Ich vermute, es ist ein array, und dass Attribute sollten in ein array-wie kann es mehr als einen, aber-Elemente (wie common-name) sollte nicht sein, da sollte es nur eins sein?
Habe ich die Beispiele hier: http://www.xml.com/pub/a/2001/11/14/xml-libxml.html
und hier: http://perl-xml.sourceforge.net/faq/#namespaces_xpath, und zu versuchen, Ihrem Beispiel Kamel-Drehbuch-arbeiten mit der my-namespace, daher der seltsame namespace.
InformationsquelleAutor John | 2010-01-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stellen Sie sicher, dass Sie die XML-Datei gültig ist, dann verwenden Sie
$node->getAttribute("someAttribute")
für den Zugriff auf Attribute.@name ist der name des Attributs. Sie würde es nutzen, in findnodes (), um anzugeben, Elemente mit einem bestimmten Attribut festgelegt. ZB. ein Pfad wie:
//camelids/species[@name="Camelus bactrianus"]/
Hier ist eine einfache/erfundenes Beispiel:
Ausgabe:
Ich entfernte den namespace und ausgewogen die tags in der XML-Datei, die Sie verweisen, um das Beispiel auszuführen. Ich werde fügen Sie den namespace zum Beispiel.
Ich aktualisiert die XML-Datei bei pastebin pastebin.com/f3fb9d1d0
Vielen Dank Niels, ich gebe es zu gehen.
Nochmals vielen Dank Neils, ich denke, es war noch ein Fehler in der xml-Datei diese Zeile sollte worden ersten (<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>) I fixed it (pastebin.com/f63e6d7a3) und versucht, läuft dein Beispiel Skript oben (danke dafür), aber ich bekomme keine Ausgabe vom script. Haben Sie versucht, es zum laufen? Es scheint, dass diese Zeile nicht funktioniert my @n = $xc->findnodes('*/Arten"); haben Sie eine Idee, warum es nicht funktioniert? Danke.
InformationsquelleAutor Niels Castle