2010-09-05 11 views
6

Obecnie używam modułu perl XML :: LibXML do sprawdzania poprawności pliku XML względem zdefiniowanego schematu XML. W tej chwili, jeśli mój plik XML nie zostanie pomyślnie sprawdzony w odniesieniu do zdefiniowanego schematu XML, otrzymam listę błędów informujących mnie, na przykład, że pewne elementy nie były oczekiwane, a następnie to, czego oczekiwano. W moim pliku XML będę miał wiele elementów o tej samej nazwie, ale mogą one być zagnieżdżone w różnych miejscach w pliku XML.Sprawdzanie poprawności XML za pomocą LibXML

Moje pytanie brzmi: czy w ogóle mogę wypisać lokalizację XPath elementów, które mogą być błędami podczas próby sprawdzenia poprawności?

Obecnie mój plik XML jest dość duży i trudno go "debugować", gdy sprawdzanie poprawności nie powiedzie się, ponieważ nazwa elementu wyświetlanego w błędzie może występować wiele razy w różnych miejscach pliku XML.

Mój kod znajduje się poniżej, aby skorzystać z LibXML do sprawdzania poprawności pliku XML względem schematu.

#!/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 [email protected] if [email protected]; 

print "$document validated successfully\n"; 

Odpowiedz

2

Czasami warto spojrzeć na: XML::Validate aby uzyskać numer wiersza i numer kolumny?

+0

Jeśli spojrzeć na źródło XML :: Waliduj :: libxml, zobaczysz, że nie zgłasza wiersz i kolumnę podczas sprawdzania za pomocą LibXML. Możesz użyć innej biblioteki do sprawdzenia poprawności. – cjm

0

Zobacz źródło Padre::Task::SyntaxChecker::XML. Moduł ten jest używany przez Padre IDE do sprawdzania składni pliku XML. Zobacz także t/01-valid.t w dystrybucji Padre-Plugin-XML na przykładzie użycia, w tym numery linii.

3

Właśnie natknąłem się na ten sam problem i okazało się, że analizator składni XML nie przechowuje numerów linii domyślnie. Ale możesz powiedzieć mu, żeby to zrobił z parametrem XML_LIBXML_LINENUMBERS konstruktora.

Poniższy skrypt pokaże aktualne numery linii dla błędów zamiast 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: [email protected]" if [email protected]; 
say "res: ", $res//'undef'; 
Powiązane problemy