Что не так с этим оператором findnodes в моем скрипте Perl? - PullRequest
6 голосов
/ 17 января 2010

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

Я пытаюсь прочитать названия видов с помощью следующего сценария perl:

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');
    }

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

1 Ответ

5 голосов
/ 17 января 2010

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

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

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

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

/*/*/ns:species

как элемент "правнука" верхнего уровня.

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

...