使用XML :: Compile在没有XML示例的情况下从XSD创建哈希

时间:2014-06-05 02:45:10

标签: xml perl xsd

我想1)根据我的XSD定义文件创建一个哈希结构,2)初始化该哈希的元素,然后3)写出一个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);

如果我要

print Dumper $ hash

如果我想创建我提供的XML文件,那么输出就是我要写的代码 - 这不是我需要的。我只想生成我的$ hash,这样我就可以在其中粘贴数据值并创建XML。似乎我只需要和XSD文件来做这件事。这有意义吗?

我不明白$ reader实际上

1 个答案:

答案 0 :(得分: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;