1

鉴于此 XML 文件片段:

<properties>
  <one>ONE</one>
  <two>TWO</two>
  <three>THREE</three>
</properties>

我想要这两个数组:

(ONE, TWO, THREE)
(one, two, three)

或者哈希也是合适的。如果可能的话,我想使用它,XML:Smart因为我已经经常使用它了。

谢谢你的时间。

4

3 回答 3

3

您可以使用它XML::Simple来解析 XML。然后简单地将键/值对提取到数组中。

use strict;
use warnings;
use Data::Dumper;

use XML::Simple;

my $file = shift;
my $xml  = XMLin($file);   # $xml is now a hash ref with the data

my @keys = keys %$xml;     # extract hash keys
my @vals = values %$xml;   # extract hash values

print Dumper \@keys, \@vals;
于 2012-05-23T13:37:01.623 回答
3

感谢您向我介绍 XML::Smart。它从我身边经过,似乎比无处不在的 XML::Simple 要好得多。

看起来您需要以哈希的形式访问 XML。这就像 XML::Simple,但在这种情况下,哈希是绑定的而不是真实的,因此实现可以更加稳固。

使用该nodes方法访问<properties>元素内的节点列表,并使用 和 获取每个元素的标签名称和文本key内容content

这是一些代码。

use strict;
use warnings;

use XML::Smart;

my $xml = <<'XML';
<properties>
  <one>ONE</one>
  <two>TWO</two>
  <three>THREE</three>
</properties>
XML

my $smart = XML::Smart->new($xml);

my @nodes = $smart->{properties}->nodes;
my @text = map $_->content, @nodes;
my @names = map $_->key, @nodes;

printf "(%s)\n", join ', ', @text;
printf "(%s)\n", join ', ', @names;

输出

(ONE, TWO, THREE)
(one, two, three)
于 2012-05-23T14:10:35.210 回答
1

我很快就用 XML::Smart 进行了尝试。此代码有效。

use strict;
use feature qw(say);
use XML::Smart;
my %config;

my $str = qq~<properties>
  <one>ONE</one>
  <two>TWO</two>
  <three>THREE</three>
</properties>~;

my $XML = XML::Smart->new($str);
my @nodes = $XML->{properties}->nodes();
foreach my $k (@nodes) {
  say "$k: ", $k->key;
  $config{$k} = $k->key;
}
print Dumper \%config;

它将打印以下内容:

ONE: one
TWO: two
THREE: three
$VAR1 = {
          'TWO' => 'two',
          'THREE' => 'three',
          'ONE' => 'one'
        };

这一切都在文档中:key-methodnodes-method

把它放在两个数组中似乎更难。也许看看i()-method

于 2012-05-23T14:08:37.017 回答