Perl XML :: Simple write Directory

96
6

Hy, я хочу написать все файлы в каталоге и всех подкаталогах в ассоциативный массив и создать 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>

пожалуйста помогите.

спросил(а) 2021-01-19T09:24:41+03:00 2 месяца, 3 недели назад
1
Решение
62

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],
};
}

ответил(а) 2021-01-19T09:24:41+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема