Проверка XML с использованием LibXML - PullRequest
6 голосов
/ 05 сентября 2010

В настоящее время я использую Perl-модуль XML :: LibXML для проверки XML-файла по определенной XML-схеме. В настоящий момент, если мой XML-файл не сможет успешно пройти проверку на соответствие определенной XML-схеме, я получу список ошибок, сообщающих мне, например, что некоторые элементы не были ожидаемыми, а затем то, что ожидалось вместо этого. В моем XML-файле у меня будет много элементов с одинаковыми именами, но они могут быть вложены в различные места XML-файла.

У меня такой вопрос, есть ли в любом случае, я могу вывести местоположение XPath любых элементов, которые могут произойти ошибка при попытке выполнить проверку?

В настоящее время мой XML-файл довольно большой, и его трудно «отладить», если проверка не удалась, поскольку имя элемента, отображаемого в ошибке, может встречаться много раз в разных местах XML-файла.

Ниже приведен код для использования LibXML для проверки XML-файла по схеме.

#!/usr/bin/perl
use strict;
use warnings;
use XML::LibXML;

my $schema_file = 'MySchema.xml';
my $document    = 'MyFile.xml';

my $schema = XML::LibXML::Schema->new(location => $schema_file);

my $parser = XML::LibXML->new;
my $doc    = $parser->parse_file($document);

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

print "$document validated successfully\n";

Ответы [ 3 ]

3 голосов
/ 19 августа 2015

Я только что наткнулся на ту же проблему и обнаружил, что анализатор XML не сохраняет номера строк по умолчанию .Но вы можете сказать ему сделать это с параметром XML_LIBXML_LINENUMBERS конструктора.

Следующий скрипт сообщит фактические номера строк для ошибок вместо 0

use Modern::Perl;
use XML::LibXML;

my ($instance, $schema) = @ARGV;

my $doc = XML::LibXML->new(XML_LIBXML_LINENUMBERS => 1)->parse_file($instance); 
my $xmlschema = XML::LibXML::Schema->new( location => $schema );
my $res = eval { $xmlschema->validate( $doc ); };

say "error: $@" if $@;
say "res: ", $res//'undef';
2 голосов
/ 05 сентября 2010

Возможно, вы захотите посмотреть: XML :: Validate , чтобы получить номер строки и номер столбца?

0 голосов
/ 08 сентября 2010

См. Источник Padre :: Task :: SyntaxChecker :: XML .Этот модуль используется в IDE Padre для проверки синтаксиса файла XML.См. Также t / 01-valid.t в дистрибутиве Padre-Plugin-XML для примера использования, включая номера строк.

...