У меня есть простой XML-файл, который похож на это:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<microplateDoc xmlns="http://moleculardevices.com/microplateML">
<camelids>
<species name="Camelus bactrianus">
<common-name>Bactrian Camel</common-name>
<physical-characteristics>
<mass>450 to 500 kg.</mass>
<appearance>
Blah blah blah
</appearance>
</physical-characteristics>
</species>
</camelids>
</microplateDoc>
Я пытаюсь считать имена разновидностей со следующим сценарием жемчуга:
use XML::LibXML;
my $parser = XML::LibXML->new();
my $doc = $parser->parse_file('/Users/johncumbers/Documents/7_Scripts/Perl/XML_to_MySQL/simplified_camelids.xml');
my $xc = XML::LibXML::XPathContext->new( $doc->documentElement() );
$xc->registerNs('ns', 'http://moleculardevices.com/microplateML');
#loop through to find species nodes
my @n = $xc->findnodes('*/species'); #was */species
foreach $nod (@n) {
print "A: ".$nod->getAttribute("name")."\n";
my @c = $nod->findnodes('./common-name');
}
Но мне не удается добраться, находят любые узлы. Могут Вы, чтобы помочь и сказать мне, почему это не работает? Что лучший веб-сайт должен искать функции жемчуга так, чтобы я мог попытаться обеспокоиться, стреляют в это сам? Как может я заставлять сценарий говорить мне, что он делает, поскольку вывод в данный момент - просто ничто.Большое спасибо.
Вы связали префикс пространства имен с документом, но ваш Syntax синтаксис не использует его.
my @n = $xc->findnodes('//ns:species');
должен сделать работу.
без префикса вы не совпадете. Также Путь * / вида
* / вида
будет соответствовать детям только в текущем контексте (то есть верхний уровень документа). Использование // Виды
найдет все виды
элементов в документе. Если это не работает для вас (потому что элемент появляется в каком-то другом контексте в документе, который вы не хотите совпадать с использованием
/*/*/ns:species
, так как элемент - «большой внук» верхнего уровня.
Еще один XPath Ссылка.