Прежде всего, всегда начинайте с
use strict;
use warnings;
Это поймает много опечаток и глупых ошибок, которые вы можете сделать. Одна большая проблема, с которой вы столкнулись, заключается в том, что null
не является термином Perl. Perl использует undef
и определенную определенную функцию (хотя в этом случае вам может не потребоваться defined
, поскольку undef
имеет значение false, а объекты обычно имеют значение true).
Вот несколько исправленная версия вашего кода. Он по-прежнему не производит запрашиваемый вывод, но он ближе.
use strict;
use warnings;
use XML::DOM;
my $parser = XML::DOM::Parser->new;
my $doc = $parser->parsefile("test.xml");
my @paramarray;
ParseXML($doc,"");
sub ParseXML {
my $node = $_[0];
my $indent = $_[1];
my $title;
if (not $node) {
return;
}
my $type = $node->getNodeType();
if ($type == DOCUMENT_NODE) {
ParseXML($node->getFirstChild(),"");
return;
}
if ($type == ELEMENT_NODE) {
my $numberAttributes =0;
if ($node->getAttributes()) {
$numberAttributes = $node->getAttributes()->getLength();
}
for (my $loopIndex =0; $loopIndex<$numberAttributes; $loopIndex++) {
my $attribute = ($node->getAttributes())->item($loopIndex);
if ($attribute->getNodeName() eq "title") {
$title = $attribute->getNodeValue();
}
}
if ($node->getNodeName() eq "params") {
foreach my $paramvar ($doc->getElementsByTagName("params")) {
foreach my $child ($paramvar->getChildNodes) {
push(@paramarray, $child->getData);
}
}
} elsif ($node->getNodeName() ne "root") {
print $node->getNodeName. ", $title, @paramarray\n";
@paramarray=();
}
my @childNodes = $node->getChildNodes(); # was missing semicolon
if (@childNodes) {
my $numberChildNodes = $#childNodes + 1;
my $loopIndex;
for ($loopIndex =0; $loopIndex<$numberChildNodes; $loopIndex++) {
ParseXML($childNodes[$loopIndex],$indent);
}
}
}
if ($type == TEXT_NODE) {
my $nodeText = $node->getNodeValue();
# Were you planning on doing something here?
}
}