2009-11-12 64 views
0

我正在尝试使用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'.

+0

你能发布错误消息,可能还有一些代码? – 2009-11-12 00:50:45

回答

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 = [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).

+0

你应该发布你的PayPal帐户。 – Ether 2009-11-12 02:37:48

+0

@Ether不,我应该学习如何更有效地赚取代表:http://stackoverflow.com/questions/1604124/what-does-the-in-a-za-z0-9-mean/1604128#1604128 – 2009-11-12 03:13:32

+0

是啊,所以SO应该有一个小技巧:)我认为他们在第一批播客中谈论了其他网站吸引了多少。 – 2009-11-12 04:05:41

1

好了,这里的一些见解:

  • 要打印"<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

+0

Schemas解析器错误:无法解析XML资源'export.xsd'。 – Rachel 2009-11-12 01:02:19

2

看起来像export.xsd不是有效的XML文件。你有没有尝试用其他工具验证它?确认你有一个有效的XML文件,然后担心其余的问题。第一件事第一!

相关问题