为什么我的XSD文件无法用XML :: LibXML解析?
我正在尝试使用LibXML::Schema Validator CPAN模块验证XML模式。在同一个脚本中,我使用XML::DOM CPAN模块来解析XML。我希望我的脚本将XML文件用XSD验证并解析它。为什么我的XSD文件无法用XML :: LibXML解析?
当我尝试运行脚本时,在对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 [email protected] if [email protected];
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'.
你的代码很混乱。你的脚本开始于一条旨在成为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 = [email protected]) {
return $ex;
}
return;
}
输出:
author title genre price pub_date review
顺便说一句,如果验证失败,错误消息是信息:Validation failed: Element 'review': This element is not expected. Expected is (pub_date).
你应该发布你的PayPal帐户。 – Ether 2009-11-12 02:37:48
@Ether不,我应该学习如何更有效地赚取代表:http://*.com/questions/1604124/what-does-the-in-a-za-z0-9-mean/1604128#1604128 – 2009-11-12 03:13:32
是啊,所以SO应该有一个小技巧:)我认为他们在第一批播客中谈论了其他网站吸引了多少。 – 2009-11-12 04:05:41
好了,这里的一些见解:
- 要打印
"<xml> is valid"
它是否实际上是正确验证。 - 当您检查
[email protected]
的结果时您有竞赛状况。要做到这一点,正确的方法是:
eval { blah; 1 } or do { die "Encountered error: [email protected]"; }
什么错误讯息您进行验证后接受?这可能是Can't locate XML/DOM/Parser.pm in @INC...
?在调用构造函数之前,你没有做use XML::DOM::Parser;
。
我想它解析XML文件,如果它是有效的
可是你有没有证明,它是:你得到错误的“架构解析错误:无法解析XML资源'export.xsd'。”也许这表明export.xsd
无效?如果验证失败,您不应该试图拨打parsefile
。
Schemas解析器错误:无法解析XML资源'export.xsd'。 – Rachel 2009-11-12 01:02:19
看起来像export.xsd不是有效的XML文件。你有没有尝试用其他工具验证它?确认你有一个有效的XML文件,然后担心其余的问题。第一件事第一!
你能发布错误消息,可能还有一些代码? – 2009-11-12 00:50:45