gpt4 book ai didi

xml - 使用 LibXML 验证 XML

转载 作者:数据小太阳 更新时间:2023-10-29 01:51:31 26 4
gpt4 key购买 nike

目前,我正在使用 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";

最佳答案

我刚刚偶然发现了同样的问题,发现 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';

关于xml - 使用 LibXML 验证 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3646689/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com