2010-09-05 12 views
6

Attualmente sto utilizzando il modulo perl XML :: LibXML per convalidare un file XML rispetto a uno schema XML definito. Al momento, se il mio file XML non riesce a convalidare con successo lo Schema XML definito, otterrò un elenco di errori che mi informano, ad esempio che alcuni elementi non erano previsti e quindi cosa invece era previsto. Nel mio file XML avrò molti elementi con lo stesso nome ma potrebbero essere annidati in vari punti del file XML.Convalidare XML utilizzando LibXML

La mia domanda è, c'è comunque in cui posso generare la posizione XPath di eventuali elementi che possono causare errori quando si tenta di eseguire la convalida?

Attualmente il mio file XML è abbastanza grande ed è difficile "eseguirne il debug" quando la convalida fallisce poiché il nome dell'elemento visualizzato nell'errore può verificarsi molte volte in vari punti del file XML.

Il mio codice è sotto per l'utilizzo di LibXML per convalidare un file XML su uno schema.

#!/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"; 

risposta

2

Si potrebbe desiderare di guardare: XML::Validate per ottenere il numero di riga e di colonna?

+0

Se si guarda alla fonte per XML :: :: Convalida LibXML, vedrete che non riporta la linea e colonna durante la convalida con LibXML. Potresti voler usare una libreria diversa con cui convalidare. – cjm

0

Vedere la fonte di Padre::Task::SyntaxChecker::XML. Questo modulo viene utilizzato da Padre IDE per eseguire il controllo della sintassi del file XML. Vedi anche t/01-valid.t nella distribuzione Padre-Plugin-XML per un esempio di utilizzo compresi i numeri di riga.

3

Mi sono appena imbattuto nello stesso problema e ho rilevato che il parser XML non memorizza i numeri di riga per impostazione predefinita. Ma puoi dirgli di farlo con il parametro XML_LIBXML_LINENUMBERS del costruttore.

Lo script che segue vi dirà numeri di riga effettivi per gli errori, invece di 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'; 
Problemi correlati