Я испытываю затруднения при понимании / использующий пространства имен с XML:: пакет LibXML в Perl. Я могу получить доступ к элементу успешно, но не атрибуту. У меня есть следующий код, который получает доступ к 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');
Я затем пытаюсь получить доступ к элементу, названному общим названием и атрибутом, названным именем.
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" ;
}
Но только латинское имя (@name
) распечатывает, общее название не. Что я делаю неправильно и как я могу заставить общее название распечатывать также?
Что @name делает в этом случае? Я предполагаю, что это - массив, и это приписывает, должен быть помещен в массив, поскольку может быть больше чем один, но элементы (как общее название) не должны быть то, потому что должен только быть тот?
Я следовал примерам здесь: http://www.xml.com/pub/a/2001/11/14/xml-libxml.html и здесь: http://perl-xml.sourceforge.net/faq/#namespaces_xpath, и пытающийся получить их сценарий верблюда в качестве примера, работающий с моим пространством имен, следовательно странное пространство имен.
Убедитесь, что файл XML действителен, затем используйте $ Node-> GetAttribute («Someattribute»)
для доступа к атрибутам.
@name - это имя атрибута. Вы бы использовали его в FindNodes (), чтобы указать элементы с заданным набором атрибута. Например. Путь, как:
// Camelids / Vishies [@ name = "Camelus bactrianus"] /
Вот простой / надуманный пример:
#!/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";
}
}
вывод:
perl ./xmltest.pl
A: Camelus bactrianus
B: common-name = Bactrian Camel