我需要针对模式验证 XML。
我试过 XML::SAX::ParserFactory; XML::Validator::Schema 和相关模块,但看起来它们是有限的。
受限于它不能识别模式元素,例如 xsd:unique、xsd:group、xsd:keyref、xsd:union 和 xsd:key。
这些 xsd:unique 等是新增功能吗?
如果您能向我指出一些最新且能够胜任任务的 Perl 模块,请不胜感激。
提前致谢。
我需要针对模式验证 XML。
我试过 XML::SAX::ParserFactory; XML::Validator::Schema 和相关模块,但看起来它们是有限的。
受限于它不能识别模式元素,例如 xsd:unique、xsd:group、xsd:keyref、xsd:union 和 xsd:key。
这些 xsd:unique 等是新增功能吗?
如果您能向我指出一些最新且能够胜任任务的 Perl 模块,请不胜感激。
提前致谢。
这使用了备受推崇的 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 上满足您需求的最佳解决方案。
您是否尝试过使用 xmllint 验证它?
@Thushan 你绝对有必要使用 Perl 吗?如果没有,为什么不试试XMLSTARLET呢?这是一个非常好的在终端中操作 XML 的工具包!
它不仅支持您需要的遗留 DTD 和 XSD,还支持 Relax-NG 模式。查看它的文档以了解如何使用 xmlstarlet 验证 XML 文档, 希望对您有所帮助;)
祝你有美好的一天!
PD 哦,我看到你使用了 xmllint!它也很棒,但我更喜欢 xmlstarlet =) 试试看;)