2009-11-12 118 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文件,然後擔心其餘的問題。第一件事第一!

相關問題