2010-08-03 5 views
3

Я пытаюсь, чтобы мой скрипт perl получал файл Xxml из Интернета и проверял его в соответствии с файлом XSD.Проверка XML в Perl с помощью libxml и файла XSD

код, чтобы сделать это следующим образом:

my $url = shift @ARGV; 
my $response = $ua->get($url) || die "Can't fetch file"; 
my $file = $response->content; 

my $schema_file = "schema.xsd"; 
my $schema = XML::LibXML::Schema->new(location => $schema_file); 
my $parser = XML::LibXML->new; 
my $doc = $parser->parse_string($file); 
eval { $schema->validate($doc) }; 
die [email protected] if [email protected]; 

Запуска это приводит скрытую ошибку: «Элемент отказ cropdata проверки содержания» (cropdata является первым из моих некорневых тегов).

В моем файле XSD, запись выглядит следующим образом:

<xs:element name="cropdata"> 
<xs:complexType> 
<xs:sequence> 

Тогда связка "<xs:element..../>" , а затем:

</xs:sequence> 
</xs:complexType> 
</xs:element> 

Зайдя в PERL отладчик показывает, что после того, как позволить строка "my $doc = $parser->parse_string($file);" run, $ doc печатает как XML :: LibXML :: Document = SCALAR (0x6b99f0).

Может ли кто-нибудь помочь мне пролить свет на то, что я делаю неправильно? (Предупреждение: это может быть глупая ошибка, я бы не пропустил ее сам).

+1

Попытайтесь использовать данные :: Dumper; Dumper ($ doc); 'сразу после вызова parse_string - правильно ли выглядит объект $ doc? – Ether

+0

@Ether, $ doc почти наверняка будет скалярным ref для числа, которое является адресом памяти структуры данных C. –

+2

Как выглядит входной XML? Действительно ли это соответствует схеме? –

ответ

0

Оказывается, что образец XML-файла, который был предоставлен мне, был недействительным, и вот, проверяя и исправляя его в xmllint, все работает.

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