目前,我使用
XML :: Lib
XML perl模块根据定义的XML模式验证XML文件.目前,如果我的XML文件无法针对定义的XML Schema成功验证,我将得到一个错误列表通知我,例如某些元素不是预期的,然后是预期的.在我的XML文件中,我将有许多相同名称的元素,但它们可能嵌套在XML文件的不同位置.
我的问题是,无论如何,我可以在尝试执行验证时输出可能出错的任何元素的XPath位置吗?
目前,我的XML文件非常庞大,并且在验证失败时很难“调试”它,因为错误中显示的元素的名称可能会在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";
解决方法
我偶然发现了同样的问题,发现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';