2010-09-05 92 views
6

目前,我正在使用XML :: LibXML perl模塊根據定義的XML模式驗證XML文件。目前,如果我的XML文件無法根據定義的XML Schema成功驗證,我會得到一個錯誤列表,通知我,例如某些元素不是預期的,然後是預期的。在我的XML文件中,我將擁有許多相同名稱的元素,但它們可能嵌套在XML文件的各個位置。使用LibXML驗證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 [email protected] if [email protected]; 

print "$document validated successfully\n"; 

回答

2

您可能想要看:XML::Validate以獲得行號和列號?

+0

如果你看看源XML ::驗證::的libxml,你會看到它不報告線和列當使用LibXML進行驗證時。您可能想要使用其他庫進行驗證。 – cjm 2010-09-05 16:33:16

0

查看Padre::Task::SyntaxChecker::XML的來源。 Padre IDE使用該模塊對XML文件進行語法檢查。有關使用示例(包括行號)的示例,另請參閱Padre-Plugin-XML分發中的t/01-valid.t。

3

我剛剛發現了同樣的問題,發現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: [email protected]" if [email protected]; 
say "res: ", $res//'undef';