Итак, у меня есть некоторый Perl-код, который выглядит примерно так:
use strict;
use XML::XPath;
# $xml is an xml string read from file
my $returnVal = mySubA($xml);
#... some more code ...
# sub definition
sub mySubA {
my ($xml) = @_;
my $xp = XML::XPath->new(xml => $xml);
my @fields = $xp->find('/elA/elB/elC')->get_nodelist;
# foreach elC, get desired info...
foreach my $field (@fields) {
$xp = XML:XPath->new(context => $field);
my $info1 = $xp->find('/info1')->string_value;
print "\nINFO1: $info1";
my $info2 = $xp->find('/info2')->string_value;
}
# do some stuff....
return $returnVal;
}
Это отлично работает и печатает INFO1: значение .... Сейчас я изменяю код и пытаюсь получить информацию из другого раздела xml, поэтому я написал для него другую подпрограмму. Чтобы избежать парсинга одного и того же xml дважды, я пытаюсь написать свой код только с использованием 1 объекта xpath (см. XPath new в perl docs ).
Так что теперь мой код похож на ....
use strict;
use XML::XPath;
# $xml is an xml string read from file
my $xp = XML::XPath->new(xml => $xml);
my $returnValA = mySubA($xp);
my $returnValB = mySubB($xp);
#... some more code ...
# sub definition
sub mySubA {
my ($xp) = @_;
my @fields = $xp->find('/elA/elB/elC')->get_nodelist;
# foreach elC, get desired info...
foreach my $field (@fields) {
$xp = XML:XPath->new(context => $field);
my $info1 = $xp->find('/info1')->string_value;
print "\nINFO1: $info1";
my $info2 = $xp->find('/info2')->string_value;
}
# do some stuff...
return $returnVal;
}
sub mySubB {
my ($xp) = @_;
# do some stuff....
return $returnVal;
}
Итак, в основном, я передаю ссылку на объект xpath в mySubA вместо того, чтобы создавать его в mySubA. Проблема в том, что значения не найдены, хотя я вполне уверен, что выражение xpath что-то разрешает, потому что цикл повторяется около 10 раз. Я новичок в Perl, поэтому я могу что-то здесь упустить, но меня смущает то, что второй метод - mySubB - работает нормально; отчасти смахнул мое первое подозрение, что существует проблема с передачей объекта xpath в подпрограмму (как, например, я не разыменываю / ссылаюсь на объект xpath, как должно быть).
Я не знаю, уместно ли это или нет, но xml, с которым я работаю, не содержит пространств имен или атрибутов.