Что случилось с этим findnodes оператором в сценарии моего Perl?

У меня есть простой 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');
    }

Но мне не удается добраться, находят любые узлы. Могут Вы, чтобы помочь и сказать мне, почему это не работает? Что лучший веб-сайт должен искать функции жемчуга так, чтобы я мог попытаться обеспокоиться, стреляют в это сам? Как может я заставлять сценарий говорить мне, что он делает, поскольку вывод в данный момент - просто ничто.Большое спасибо.

6
задан martin clayton 17 January 2010 в 00:39
поделиться

1 ответ

Вы связали префикс пространства имен с документом, но ваш Syntax синтаксис не использует его.

my @n = $xc->findnodes('//ns:species');

должен сделать работу.

без префикса вы не совпадете. Также Путь * / вида * / вида будет соответствовать детям только в текущем контексте (то есть верхний уровень документа). Использование // Виды найдет все виды элементов в документе. Если это не работает для вас (потому что элемент появляется в каком-то другом контексте в документе, который вы не хотите совпадать с использованием

/*/*/ns:species

, так как элемент - «большой внук» верхнего уровня.

Еще один XPath Ссылка.

5
ответ дан 17 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: