3

我需要针对模式验证 XML。

我试过 XML::SAX::ParserFactory; XML::Validator::Schema 和相关模块,但看起来它们是有限的。
受限于它不能识别模式元素,例如 xsd:unique、xsd:group、xsd:keyref、xsd:union 和 xsd:key。

这些 xsd:unique 等是新增功能吗?

如果您能向我指出一些最新且能够胜任任务的 Perl 模块,请不胜感激。

提前致谢。

4

3 回答 3

10

看看XML::LibXML

这使用了备受推崇的 libxml2 库,大多数人认为它是基于 Expat 和XML::Parser的模块的继承者。

对于模式验证,请查看XML::LibXML::Schema

use XML::LibXML;
use XML::LibXML::Schema;

my $schema = XML::LibXML::Schema->new(location => 'file.xsd' );
my $parser = XML::LibXML->new;

my $xml    = 'file.xml';
my $doc    = $parser->parse_file( $xml );

eval { $schema->validate( $doc ) };
die $@ if $@;

say "$xml is valid\n";

注意。我仍然主要是XML::Twig用户并且几乎不接触 XML 架构,所以我不知道 XML::LibXML::Schema 是否会解决您遇到的问题,但它可能是 CPAN 上满足您需求的最佳解决方案。

于 2008-11-27T15:50:31.507 回答
2

您是否尝试过使用 xmllint 验证它?

于 2008-11-26T23:18:48.497 回答
1

@Thushan 你绝对有必要使用 Perl 吗?如果没有,为什么不试试XMLSTARLET呢?这是一个非常好的在终端中操作 XML 的工具包!

它不仅支持您需要的遗留 DTD 和 XSD,还支持 Relax-NG 模式。查看它的文档以了解如何使用 xmlstarlet 验证 XML 文档, 希望对您有所帮助;)

祝你有美好的一天!

PD 哦,我看到你使用了 xmllint!它也很棒,但我更喜欢 xmlstarlet =) 试试看;)

于 2012-02-17T20:12:09.323 回答