2010-09-05 15 views
6

Actualmente, estoy usando el módulo XML :: LibXML perl para validar un archivo XML con un esquema XML definido. Por el momento, si mi archivo XML no puede validar con éxito contra el Esquema XML definido, obtendré una lista de errores que me informan, por ejemplo, que ciertos elementos no se esperaban y luego se esperaba lo que se esperaba. En mi archivo XML tendré muchos elementos del mismo nombre pero pueden estar anidados en varios lugares en el archivo XML.Validar XML utilizando LibXML

Mi pregunta es, ¿de todos modos puedo dar salida a la ubicación XPath de cualquier elemento que pueda tener errores al intentar realizar la validación?

Actualmente, mi archivo XML es bastante grande y es difícil "depurarlo" cuando falla la validación ya que el nombre del elemento que se muestra en el error puede aparecer muchas veces en varios lugares del archivo XML.

Mi código está a continuación para usar LibXML para validar un archivo XML con un esquema.

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

Respuesta

2

Es posible que desee mirar: XML::Validate para obtener el número de línea y el número de columna?

+0

Si nos fijamos en la fuente para XML :: :: Validar LibXML, verá que no informa de la línea y la columna al validar con LibXML. Es posible que desee utilizar una biblioteca diferente para validar con. – cjm

0

Ver fuente de Padre::Task::SyntaxChecker::XML. Este módulo es utilizado por Padre IDE para hacer la verificación de sintaxis del archivo XML. Consulte también t/01-valid.t en la distribución Padre-Plugin-XML para ver un ejemplo de uso, incluidos los números de línea.

3

Acabo de tropezar con el mismo problema y encontré que el analizador XML no almacena los números de línea de forma predeterminada. Pero puede decirle que lo haga con el parámetro XML_LIBXML_LINENUMBERS del constructor.

La siguiente secuencia de comandos le dirá los números individuales reales para los errores en lugar de 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'; 
Cuestiones relacionadas