Почему мой XSD-файл не удается проанализировать с XML :: LibXML? - PullRequest
0 голосов
/ 12 ноября 2009

Я пытаюсь проверить XML по схеме, используя LibXML :: Schema Validator Модуль CPAN. В этом же скрипте я использую XML :: DOM CPAN модуль для анализа XML. Я хочу, чтобы мой скрипт взял XML-файл, проверил его по XSD и проанализировал.

Когда я пытаюсь запустить скрипт, после проверки по xsd он завершает работу и не анализирует XML. Я хочу, чтобы он анализировал XML-файл, если он действителен, и генерировал структуру DOM. Я был бы очень признателен, если бы кто-нибудь поделился своими мыслями об этом.

#usr/bin/perl -w
use XML::LibXML;

my $schema = XML::LibXML::Schema->new(location =>'export.xsd');
my $parser = XML::LibXML->new;

my $xml    = 'Export.xml';
my $doc    = $parser->parse_file($xml);

eval { $schema->validate( $doc ) };
print $@ if $@;

print "$xml is valid\n";

use XML::DOM;
#use strict;

my $parser = new XML::DOM::Parser;
my $doc = $parser->parsefile ("Export.xml");

my $productOfferingnodes = $doc->getElementsByTagName("productOfferings")->item(0);
my @productOffering = $productOfferingnodes->getChildNodes();
    {
        foreach  my $productOffering(@productOffering) 
        {
            if ($productOffering->getNodeType == ELEMENT_NODE)
            {
                print $productOffering->getNodeName; 
                     }
             }
     } 

Сообщение об ошибке:

Schemas parser error : Failed to parse the XML resource 'export.xsd'.

Ответы [ 3 ]

5 голосов
/ 12 ноября 2009

Ваш код грязный. Ваш сценарий начинается со строки, которая предназначена для линии Шебанга, но это не так. Вы переопределяете две переменные в этом коротком скрипте. Вы проверяете, провалилась ли проверка, и весело продолжаете свой путь, даже если он прошел. Вероятно, это не причина ваших проблем, но они затрудняют диагностику проблемы. Я попытался изменить ваш код. Код ниже проходит 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 ).

2 голосов
/ 12 ноября 2009

Похоже, export.xsd не является допустимым файлом XML. Вы пытались проверить это с помощью другого инструмента? Убедитесь, что у вас есть действительный файл XML, а затем позаботьтесь об остальной проблеме. Перво-наперво!

1 голос
/ 12 ноября 2009

Хорошо, вот некоторые идеи:

  • Вы печатаете "<xml> is valid" независимо от того, действительно ли оно было проверено правильно.
  • У вас есть состояние гонки, когда вы проверяете результат $@. Правильный способ сделать это:

eval { blah; 1 } or do { die "Encountered error: $@"; }

Какое сообщение об ошибке вы получаете после выполнения проверки? Это возможно Can't locate XML/DOM/Parser.pm in @INC...? Вы не делаете use XML::DOM::Parser; перед вызовом его конструктора.

Я хочу, чтобы он анализировал XML-файл, если он действителен

Но вы еще не доказали, что это так: вы получаете сообщение об ошибке «Ошибка синтаксического анализатора схем: не удалось проанализировать ресурс XML« export.xsd »». Возможно, это означает, что export.xsd недействительно? Вы не должны пытаться позвонить parsefile, если проверка не удалась.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...