是的,明智的选择。 XML::Simple ... 不是。它是 for 简单的 XML。
正如 cmets 中所指出的 - 您的数据有点模棱两可 - 具体来说,您如何判断在“组”或“用户”中应该调用哪些元素。
看起来您可能已经解析了一些 JSON。 (确实可以直接转回JSON:
print to_json ( $data, { pretty => 1 } );
核心问题是 - JSON 支持数组,而 XML 不支持。因此,您几乎无法直接将您的数据结构转换为 XML。
但是,如果您不介意自己做一些工作:
以下是使用 XML::Twig 组装一些 XML 的方法
Assembling XML in Perl
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig->new( 'pretty_print' => 'indented' );
$twig->set_root(
XML::Twig::Elt->new(
'map',
)
);
my $item = $twig->root->insert_new_elt('item', { 'id' => 1, 'name' => 'A' } );
my $users = $item ->insert_new_elt( 'users' );
$users -> insert_new_elt ( 'user', { 'id' => 1, 'name' => 'u1' } );
$users -> insert_new_elt ( 'user', { 'id' => 2, 'name' => 'u2' } );
my $groups = $item -> insert_new_elt ('last_child', 'groups');
$groups -> insert_new_elt ( 'group', { 'id' => 1, 'name' => 'g1' } );
$twig->set_xml_version("1.0");
$twig->set_encoding('utf-8');
$twig->print;
哪些打印:
<?xml version="1.0" encoding="utf-8"?>
<map>
<item id="1" name="A">
<users>
<user id="2" name="u2"/>
<user id="1" name="u1"/>
</users>
<groups>
<group id="1" name="g1"/>
</groups>
</item>
</map>
迭代您的数据结构留给读者作为练习。
正如 Borodin 正确指出的那样 - 您无法从数据结构中推断出 map item group 或 user。后两者你可以也许根据复数推断,但鉴于你的数据集,我能想到的最好的结果是这样的:
use strict;
use warnings;
use XML::Twig;
my $data = {
id => 1,
name => "A",
users => [ { id => 1, name => "u1" }, { id => 2, name => "u2" } ],
groups => [ { id => 1, name => "g1" } ]
};
my $twig = XML::Twig->new( 'pretty_print' => 'indented' );
$twig->set_root( XML::Twig::Elt->new( 'map', ) );
my $item = $twig->root->insert_new_elt('item');
foreach my $key ( keys %$data ) {
if ( not ref $data->{$key} ) {
$item->set_att( $key, $data->{$key} );
next;
}
if ( ref( $data->{$key} ) eq "ARRAY" ) {
my $fakearray = $item->insert_new_elt($key);
foreach my $element ( @{ $data->{$key} } ) {
my $name = $key;
$name =~ s/s$//g;
$fakearray->insert_new_elt( $name, $element );
}
next;
}
if ( ref ( $data -> {$key} ) eq "HASH" ) {
$item -> insert_new_elt( $key, $data -> {$key} );
next;
}
}
$twig->set_xml_version("1.0");
$twig->set_encoding('utf-8');
$twig->print;
这并不理想,因为 - map 是硬编码的,item 也是如此。我采用非常简单的方法,假设数组末尾有一个s,将其复数化。