如何创建包含给定哈希的XML文件(在特定位置)?

时间:2016-02-03 11:34:18

标签: xml perl

所以我有一个简单的哈希key=>{value},我需要在XML文件中(在特定位置)输出它。

输出应该是这样的:

<keys> <key1> <value1> </value1> </key1> </keys> 

我在其他论坛上搜索过,发现xml :: Simple是一个解决方案,但在Perl中是新的。

2 个答案:

答案 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案例相当不错。我希望提供另一种建议 - 请勿使用JSONXML非常强大和复杂,但它实际上是作为文档格式设计的 - 想想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属性,xpathXSLT处理)那么这可能更合适 - 我建议,因为您表明您想要导出一个简单的哈希。

但无论如何 - don't use XML::Simple - it isn't simple at all.