HY, 我想将目录中的所有文件和所有子目录写入关联数组,并从此aray创建XML。这是我的代码。
use strict;
use warnings;
use File::Find;
use Data::Dumper;
use XML::Simple;
my $base_dir = '.';
my $xs = new XML::Simple;
my %filelist;
find(\&print_name_if_dir, $base_dir);
sub print_name_if_dir
{
if (-f $_) {
$filelist{$File::Find::name}{size}=-s $_;
$filelist{$File::Find::name}{time}=(stat $_)[9];
}
}
print Dumper(\%filelist);
my $xml = $xs->XMLout(\%filelist, keyattr => "filename");
print $xml;
这是我的输出:
$VAR1 = {
'./out.log' => {
'size' => 51,
'time' => 1345720984
},
'./foo/bat.txt' => {
'size' => 24,
'time' => 1345708287
},
'./test.pl' => {
'size' => 438,
'time' => 1345720762
}
};
<opt>
<./out.log size="51" time="1345720984" />
<./foo/bat.txt size="24" time="1345708287" />
<./test.pl size="438" time="1345720762" />
</opt>
数组没问题,但XML看起来应该是这样的:
<file name="bla.txt">
<time>"1234"</time>
<size>"1234"</size>
</file>
请帮帮我。
答案 0 :(得分:2)
XML::Simple
很简单。它的文档甚至自己这么说。你不可能从中获得所有可能的输出形式,而你的输出形式很可能是不可能的。
然而,你可以比现在更接近,例如这个存储结构:
my $files = {
file => [
{ name => 'chunky.txt', time => 12345, size => 321 },
{ name => 'bacon.dat', time => 47123, size => 222 },
],
};
这将导致以下输出(通过print XMLout($files)
):
<opt>
<file name="chunky.txt" size="321" time="12345" />
<file name="bacon.dat" size="222" time="47123" />
</opt>
在我看来,不可能强迫time
和size
作为子项而不是属性输出。
哦,可以使用以下代码轻松构建这样的结构:
my %filelist = ( file => [] );
sub print_name_if_dir {
return unless -f;
push @{ $filelist{file} }, {
name => $_,
size => -s $_,
time => (stat $_)[9],
};
}