我正在尝试使用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;
}
}
}
错误讯息:
Schemas parser error : Failed to parse the XML resource 'export.xsd'.
答案 0 :(得分:5)
你的代码很乱。你的脚本以一条线开头,这条线是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
顺便说一句,验证失败时的错误消息是提供信息的:Validation failed: Element 'review': This element is not expected. Expected is (pub_date ).
答案 1 :(得分:2)
看起来 export.xsd 不是有效的XML文件。您是否尝试使用其他工具验证它?验证您是否拥有有效的XML文件,然后担心其余问题。首先要做的事情!
答案 2 :(得分:1)
好的,这里有一些见解:
"<xml> is valid"
,无论它是否确实已经过正确验证。$@
的结果时,您有竞争条件。正确的方法是: eval { blah; 1 } or do { die "Encountered error: $@"; }
执行验证后您收到了什么错误消息?它可能是Can't locate XML/DOM/Parser.pm in @INC...
吗?在调用构造函数之前,你没有做use XML::DOM::Parser;
。
我希望它解析xml文件是否有效
但是你还没有证明它是:你得到错误“模式解析器错误:无法解析XML资源'export.xsd'。”也许这表明export.xsd
无效?如果验证失败,您不应该尝试调用parsefile
。