2009-11-12 1 views
0

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

Когда я пытаюсь запустить скрипт, после проверки с помощью 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 [email protected] if [email protected]; 

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'.

+0

Не могли бы вы опубликовать сообщение ошибки и, возможно, некоторые кода? –

ответ

5

Ваш код грязный. Ваш скрипт начинается с строки, которая предназначена для линии shebang, но не является. Вы переопределяете две переменные в этом коротком скрипте. Вы проверяете, не прошла ли проверка, и весело отправилась на ваш путь, даже если это произошло. Вероятно, это не причина ваших проблем, но они затрудняют диагностику проблемы. Я попытался реорганизовать ваш код. Код ниже проходит perl -c. Кроме того, я попробовал это, используя sample XML and XSD files. Как объясняется на этой странице, с отсутствующим элементом проверка достоверности не удалась. Когда добавленная недостающая информация была добавлена, проверка прошла успешно и ожидаемый результат был произведен.

#!/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 = [email protected]) { 
     return $ex; 
    } 
    return; 
} 

Выход:

 
author 
title 
genre 
price 
pub_date 
review 

Кстати, сообщение об ошибке при проверке произошел сбой был информативен: Validation failed: Element 'review': This element is not expected. Expected is (pub_date).

+0

Вы должны разместить свою учетную запись в PayPal. – Ether

+0

@Ether Нет, я должен научиться зарабатывать повторителей более эффективно: http://stackoverflow.com/questions/1604124/what-does-the-in-a-za-z0-9-mean/1604128#1604128 –

+0

Да , SO должен иметь банку наконечника :) Я думаю, они говорили о том, сколько из них засасывалось для других сайтов в одном из первых подкастов. –

1

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

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

eval { blah; 1 } or do { die "Encountered error: [email protected]"; }

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

Хочу разобрать файл XML, если это действительно

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

+0

Ошибка анализатора схем: не удалось проанализировать XML-ресурс 'export.xsd'. – Rachel

2

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

Смежные вопросы