2008-11-26 83 views
3

我需要验证XML模式的架构。是否有Perl模块根据模式验证XML?

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

这些xsd:独特的等新增加了吗?

欣赏如果你能指向我的一些Perl模块,它是最新的,并达到任务。

在此先感谢。

回答

2

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

+0

xmllint的命令行工具工作得很好。 谢谢JDrago! – Thushan 2008-11-27 15:37:20

10

看一看XML::LibXML

这里使用了高度重视libxml2库,大多数人举出的继任者外籍和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 [email protected] if [email protected]; 

say "$xml is valid\n"; 

NB。我仍然主要是一个XML::Twig用户,几乎不接触XML模式,所以我不知道XML :: LibXML :: Schema是否能够解决您遇到的问题,但它可能是CPAN上满足您需求的最佳解决方案。

1

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

它不仅支持传统DTD和XSD,还支持Relax-NG模式。检查它的文档,以了解如何Validate XML Documents with xmlstarlet 我希望这可以帮助你;)

祝你有美好的一天!

PD哦,我看到你用过xmllint!这太好了,但我更喜欢xmlstarlet =)试试吧)

+0

`xmllint`的好处在于它使用与XML :: LibXML相同的库,所以当我想做一些比单个`xmllint`命令更复杂的事情时,我可以轻松切换到Perl。我使用`xmlstarlet`进行简单的XML转换。 – reinierpost 2014-05-27 09:25:37