使用LibXML验证XML

6

目前,我正在使用XML::LibXML perl模块来根据定义的XML模式验证XML文件。目前,如果我的XML文件无法成功通过定义的XML模式进行验证,则会收到一系列错误列表,告知我某些元素不被期望,以及期望的内容是什么。在我的XML文件中,我将有许多同名元素,但它们可能嵌套在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 $@ if $@;

print "$document validated successfully\n";
3个回答

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: $@" if $@;
say "res: ", $res//'undef';

2
你可能想看一下:XML::Validate,以获取行号和列号?

如果您查看XML :: Validate :: LibXML的源代码,您会发现在使用LibXML进行验证时它不会报告行和列。您可能需要使用其他库进行验证。 - cjm

0

查看Padre::Task::SyntaxChecker::XML的源代码。该模块被Padre IDE用于对XML文件进行语法检查。还可以在Padre-Plugin-XML分发中查看t/01-valid.t,其中包括使用示例和行号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接