0

こんにちは、私はディレクトリ内のすべてのファイルとすべてのサブディレクトリを連想配列に書き込み、この配列から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> 

私を助けてください。

4

1 に答える 1

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>

私の意見では、不可能なのは、属性ではなく子として強制的に出力することですtimesize

ああ、そのような構造は次のコードで簡単に構築できます:

my %filelist = ( file => [] );

sub print_name_if_dir {
  return unless -f;

  push @{ $filelist{file} }, {
    name => $_,
    size => -s $_,
    time => (stat $_)[9],
  };
}
于 2012-08-23T11:44:36.303 に答える