Ваш код грязный. Ваш сценарий начинается со строки, которая предназначена для линии Шебанга, но это не так. Вы переопределяете две переменные в этом коротком скрипте. Вы проверяете, провалилась ли проверка, и весело продолжаете свой путь, даже если он прошел. Вероятно, это не причина ваших проблем, но они затрудняют диагностику проблемы. Я попытался изменить ваш код. Код ниже проходит perl -c
. Далее я попробовал использовать файлы sample XML
и XSD
. Как объяснено на этой странице, при отсутствии элемента проверка не удалась. Когда недостающая информация была добавлена, проверка прошла успешно и был получен ожидаемый результат.
#!/usr/bin/env perl
use strict; use warnings;
use XML::LibXML;
use XML::DOM;
my $xml = 'Export.xml';
my $xsd = 'export.xsd';
if ( my $error = validate_xml_against_xsd($xml, $xsd) ) {
die "Validation failed: $error\n";
}
my @offerings = get_product_offerings( $xml );
print "$_\n" for @offerings;
sub get_product_offerings {
my ($xml) = @_;
my $parser = XML::DOM::Parser->new;
my $doc = $parser->parsefile($xml);
my $nodes = $doc->getElementsByTagName("book")->item(0);
return map {
$_->getNodeType == ELEMENT_NODE
? $_->getNodeName
: ()
} $nodes->getChildNodes;
}
sub validate_xml_against_xsd {
my ($xml, $xsd) = @_;
my $schema = XML::LibXML::Schema->new(location => $xsd);
my $parser = XML::LibXML->new;
my $doc = $parser->parse_file($xml);
eval { $schema->validate( $doc ) };
if ( my $ex = $@ ) {
return $ex;
}
return;
}
Выход:
author
title
genre
price
pub_date
review
Кстати, сообщение об ошибке при сбое проверки было информативным: Validation failed: Element 'review': This element is not expected. Expected is (pub_date ).