我想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实际上是。
答案 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;