鉴于此 XML 文件片段:
<properties>
<one>ONE</one>
<two>TWO</two>
<three>THREE</three>
</properties>
我想要这两个数组:
(ONE, TWO, THREE)
(one, two, three)
或者哈希也是合适的。如果可能的话,我想使用它,XML:Smart
因为我已经经常使用它了。
谢谢你的时间。
鉴于此 XML 文件片段:
<properties>
<one>ONE</one>
<two>TWO</two>
<three>THREE</three>
</properties>
我想要这两个数组:
(ONE, TWO, THREE)
(one, two, three)
或者哈希也是合适的。如果可能的话,我想使用它,XML:Smart
因为我已经经常使用它了。
谢谢你的时间。
您可以使用它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;
感谢您向我介绍 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)
我很快就用 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-method,nodes-method
把它放在两个数组中似乎更难。也许看看i()-method。