【问题标题】:Perl XML::Simple write DirectoryPerl XML::简单写目录
【发布时间】:2012-08-23 11:29:30
【问题描述】:

嘿, 我想将目录中的所有文件和所有子目录写入关联数组并从此数组创建 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> 

请帮助我。

【问题讨论】:

    标签: xml perl xml-simple


    【解决方案1】:

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

    【讨论】:

    • 非常感谢!你知道我如何在没有循环的情况下在这个数组中搜索一个特定的文件名,然后访问它的属性吗?
    • 没有循环?您也可以简单地将在print_name_if_dir 中创建的哈希引用按文件名存储在第二个哈希中(我们称之为%filerefs)。将此添加为print_name_if_dir 中的最后一行:$filerefs{$_} = $filelist{file}-&gt;[-1];
    猜你喜欢
    • 2011-01-25
    • 2013-08-06
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多