我正在尝试使用
LibXML::Schema Validator CPAN模块验证XML对模式.在同一个脚本中我使用
XML::DOM CPAN模块来解析XML.我希望我的脚本能够使用XML文件对XSD进行验证并解析它.
当我尝试运行脚本时,在对xsd进行验证后,它退出并且不解析XML.我希望它解析XML文件,如果它有效并生成DOM结构.如果有人可以分享一些见解,我将非常感激.
#usr/bin/perl -w use XML::LibXML; my $schema = XML::LibXML::Schema->new(location =>'export.xsd'); my $parser = XML::LibXML->new; my $xml = 'Export.xml'; my $doc = $parser->parse_file($xml); eval { $schema->validate( $doc ) }; print $@ if $@; print "$xml is valid\n"; use XML::DOM; #use strict; my $parser = new XML::DOM::Parser; my $doc = $parser->parsefile ("Export.xml"); my $productOfferingnodes = $doc->getElementsByTagName("productOfferings")->item(0); my @productOffering = $productOfferingnodes->getChildNodes(); { foreach my $productOffering(@productOffering) { if ($productOffering->getNodeType == ELEMENT_NODE) { print $productOffering->getNodeName; } } }
错误信息:
模式解析器错误:无法解析XML资源’export.xsd’.
你的代码很乱.你的脚本以一条线开头,这条线是shebang线,但不是.您在此简短脚本中重新定义了两个变量.你检查验证是否失败,即使它确实如此,也要快乐地继续.这些可能不是您的问题的原因,但它们确实使问题的诊断更加困难.我试图重构你的代码.下面的代码传递perl -c.此外,我尝试使用
sample
XML
and XSD
files.如该页面上所述,缺少元素,验证失败.添加缺失信息后,验证成功并生成预期输出.
#!/usr/bin/env perl use strict; use warnings; use XML::LibXML; use XML::DOM; my $xml = 'Export.xml'; my $xsd = 'export.xsd'; if ( my $error = validate_xml_against_xsd($xml,$xsd) ) { die "Validation Failed: $error\n"; } my @offerings = get_product_offerings( $xml ); print "$_\n" for @offerings; sub get_product_offerings { my ($xml) = @_; my $parser = XML::DOM::Parser->new; my $doc = $parser->parsefile($xml); my $nodes = $doc->getElementsByTagName("book")->item(0); return map { $_->getNodeType == ELEMENT_NODE ? $_->getNodeName : () } $nodes->getChildNodes; } sub validate_xml_against_xsd { my ($xml,$xsd) = @_; my $schema = XML::LibXML::Schema->new(location => $xsd); my $parser = XML::LibXML->new; my $doc = $parser->parse_file($xml); eval { $schema->validate( $doc ) }; if ( my $ex = $@ ) { return $ex; } return; }
输出:
author title genre price pub_date review
顺便说一句,验证失败时的错误消息提供了信息:验证失败:元素’审核’:不期望此元素.预计是(pub_date).