2014-06-05 56 views
0

我想要1)根據我的XSD定義文件創建哈希結構,2)初始化該哈希的元素,然後3)寫出一個XML文件。這裏是我在哪裏︰從XSD創建沒有XML的哈希示例使用XML ::編譯

我設法做的是創建一個哈希,但我通過閱讀一個示例XML文件 - 我這樣做,因爲我遵循代碼示例我發現了,但我認爲這些例子試圖完成除我需要做的事情之外的事情。我只需要知道哈希是什麼樣的,我可以設置其元素的值,我不想或不需要知道某個任意XML文件初始化的特定哈希是什麼樣子。

這是我到目前爲止已經完成:

#!/usr/bin/perl 
use warnings; 
use strict; 
use Data::Dumper; 
use XML::LibXML; 
use XML::Compile::Schema; 
use File::Spec; 
use File::Copy; 
use Getopt::Long; 
use String::Util; 

my $xsd   = 'My_XMLSchema.xsd'; 
my $xml_in  = 'example.xml'; 

my $schema  = XML::Compile::Schema->new($xsd); 
my $reader  = $schema->compile(READER => '{http://tempuri.org/XMLSchema.xsd}RootElement'); 

my $hash   = $reader->($xml_in); 
my $doc   = XML::LibXML::Document->new('1.0', 'UTF-8'); 
my $write  = $schema->compile(WRITER => '{http://tempuri.org/XMLSchema.xsd}RootElement'); 
my $xml_out  = $write->($doc, $hash); 

如果我

打印自卸車$哈希

輸出,如果我想我會寫的代碼創建我提供的XML文件 - 這不是我所需要的。我只是想生成我的$ hash,這樣我就可以將數據值保存在其中並創建一個XML。似乎我應該只需要和XSD文件來做到這一點。這有意義嗎?

我不明白什麼是$讀者其實

回答

0

您需要創建一個與您的示例數據具有相同結構的數據結構。 示例XML文件可以用作數據結構外觀的靈感,但在最終的程序中不需要。

以下是一個基於sample schema from w3schools的示例。

use warnings; 
use strict; 
use Data::Dumper; 
use XML::LibXML; 
use XML::Compile::Schema; 

my $xsd   = 'shiporder.xsd'; 
my $xml_in  = 'shiporder.xml'; 

my $schema  = XML::Compile::Schema->new($xsd); 

# This can be removed for production 
# as the output serves only as an inspiration for $real_hash 
{ 
    my $reader  = $schema->compile(READER => 'shiporder'); 
    my $sample_hash = $reader->($xml_in); 

    print Dumper($sample_hash); 
} 

# a hashref just like $sample_hash, but with my data 
my $real_hash = { 
      'orderid' => '42', 
      'shipto' => { 
         'address' => 'Lindenstrasse 23', 
         'city' => 'Munich', 
         'country' => 'Germany', 
         'name' => 'Max Mustermann', 
        }, 
      'item' => [ 
        { 
         'quantity' => '1', 
         'price' => bless({ 
             '_es' => '-', 
             '_e' => [ 
                1 
               ], 
             '_m' => [ 
                109 
               ], 
             'sign' => '+' 
             }, 'Math::BigFloat'), 
         'title' => 'dog feed', 
         'note' => 'delicious' 
        }, 
        { 
         'price' => bless({ 
             '_m' => [ 
                99 
               ], 
             '_e' => [ 
                1 
               ], 
             '_es' => '-', 
             'sign' => '+' 
             }, 'Math::BigFloat'), 
         'title' => 'Enjoy', 
         'quantity' => '1' 
        } 
        ], 
      'orderperson' => 'Martina Musterfrau' 
     }; 

my $doc   = XML::LibXML::Document->new('1.0', 'UTF-8'); 
my $write  = $schema->compile(WRITER => 'shiporder'); 
my $xml_out  = $write->($doc, $real_hash); 
print "\n"; 
print $xml_out; 
+0

謝謝。哈希結構已經創建 - 這是使用XML :: Compile爲我完成的。我用來創建哈希的例子看起來既可以使用XSD模式定義文件,也可以使用示例XML文件。我試圖瞭解樣本文件是否真的需要,如果是這樣,爲什麼。當我已經提供了XSD時,我確實需要使用XML對我來說沒有意義。 –

+0

我編輯了我的答案,澄清了示例文件的讀取可以刪除。 – BarneySchmale