使用 LibXML 验证 XML

Posted

技术标签:

【中文标题】使用 LibXML 验证 XML【英文标题】:Validate XML using LibXML 【发布时间】:2010-09-05 15:59:31 【问题描述】:

目前,我正在使用 XML::LibXML perl 模块来根据定义的 XML 模式验证 XML 文件。目前,如果我的 XML 文件无法针对定义的 XML Schema 成功验证,我将收到一个错误列表,通知我,例如某些元素不是预期的,然后是预期的。在我的 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";

【问题讨论】:

【参考方案1】:

我刚刚偶然发现了同样的问题,发现 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 进行验证时它不会报告行和列。您可能希望使用不同的库进行验证。【参考方案3】:

查看Padre::Task::SyntaxChecker::XML 的来源。 Padre IDE 使用此模块对 XML 文件进行语法检查。另请参阅 Padre-Plugin-XML 分发中的 t/01-valid.t 以获取包括行号在内的使用示例。

【讨论】:

以上是关于使用 LibXML 验证 XML的主要内容,如果未能解决你的问题,请参考以下文章

PHP libxml 中针对 XSD 的 XML 验证

在电子应用程序中使用 libxml-xsd 失败并出现绑定错误

libxml的使用--读取xml

libxml2 安装及使用

使用 XML::LibXML 遍历节点

使用 C++ 针对 xsd 验证 xml