所以我有一个简单的哈希key=>{value}
,我需要在XML文件中(在特定位置)输出它。
输出应该是这样的:
<keys> <key1> <value1> </value1> </key1> </keys>
我在其他论坛上搜索过,发现xml :: Simple是一个解决方案,但在Perl中是新的。
答案 0 :(得分:2)
XML :: Simple非常糟糕,特别是对于生成XML。
你说的格式应该如下:
<keys>
<key1><value1></value1></key1>
[...]
</keys>
这种格式没有多大意义。下面的解决方案以下列格式生成XML:
<elements>
<element><key>key1</key><value>value1</value></element>
[...]
</elements>
解决方案:
use XML::Writer qw( );
open(my $fh, '>', $qfn)
or die("Can't create \"$qfn\": $!\n");
my $writer = XML::Writer->new(OUTPUT => $fh);
$writer->xmlDecl();
$writer->startTag("elements");
for my $key (sort keys(%hash)) {
$writer->startTag("element");
$writer->dataElement("key", $key);
$writer->dataElement("value", $hash{$key});
$writer->endTag("element");
}
$writer->endTag("keys");
$writer->end();
以下是terser格式:
<elements>
<element key="key1">value1</element>
[...]
</elements>
解决方案:
use XML::Writer qw( );
open(my $fh, '>', $qfn)
or die("Can't create \"$qfn\": $!\n");
my $writer = XML::Writer->new(OUTPUT => $fh);
$writer->xmlDecl();
$writer->startTag("elements");
for my $key (sort keys(%hash)) {
$writer->dataElement("element", $hash{$key}, key => $key);
}
$writer->endTag("keys");
$writer->end();
随意调整。
答案 1 :(得分:0)
ikegami已涵盖哈希 - &gt; XML案例相当不错。我希望提供另一种建议 - 请勿使用JSON
。 XML
非常强大和复杂,但它实际上是作为文档格式设计的 - 想想HTML如何做事 - 你有标签,属性和内容。
对于大量用例,最好使用JSON
- 它是一种更简单的哈希和数组格式。因此,它更直接地反映了perl数据类型。
所以你可以这样做:
#!/usr/bin/env perl
use strict;
use warnings;
use JSON;
my %stuff = ( key => "value",
another_key => "another_value",
some_tags => [ "tag1", "tag2", "tag3" ] );
print to_json ( \%stuff, { pretty => 1 } );
这会给你:
{
"key" : "value",
"another_key" : "another_value",
"some_tags" : [
"tag1",
"tag2",
"tag3"
]
}
如果只是to_json ( \%stuff );
:
{"another_key":"another_value","key":"value","some_tags":["tag1","tag2","tag3"]}
重读它就像:
my $json_str = to_json ( \%stuff );
my $json_object = from_json ( $json_str );
print Dumper \$json_object;
如果您只需要哈希和数组(并且可以不使用XML属性,xpath
,XSLT
处理)那么这可能更合适 - 我建议,因为您表明您想要导出一个简单的哈希。