我有简单的XML,我想在Perl中读取并使哈希包含所有读取密钥。
考虑以下代码:
Item
当XML文件包含许多$content
标记时,此代码段效果很好。然后Item
是对数组的引用。但是当只有一个$content
时,我在解除引用为数组时会出错。我的假设是d = (double)(a/b);
是对标量的引用,而不是数组。
确保从XML中读取值数组的做法是什么?
答案 0 :(得分:8)
你需要的是不使用XML::Simple
然后它真的是微不足道的。我最喜欢的相当直接的XML样本是XML::Twig
use XML::Twig;
my $twig = XML::Twig -> new -> parsefile ( 'filesmap.xml' );
my @files = map { $_ -> trimmed_text } $twig -> get_xpath ( '//Path' );
通过更详细的XML示例(以及期望的结果),我将能够为您提供更好的答案。
XML::Simple
的部分问题是它试图将XML数据结构转换为perl数据结构,并且 - 因为哈希是键值而无序但是数组是有序的,它不得不猜。有时它做错了,有时则不一致。
如果您希望它保持一致,可以设置:
my $xml = XMLin( "filesmap.xml", ForceArray => 1, KeyAttr => [], ForceContent => 1 );
但实际上 - XML::Simple
只是一条痛苦的途径。不要使用它。如果您不喜欢XML::Twig
,请尝试使用XML::LibXML
。
答案 1 :(得分:1)
我要说的是展平 - 步骤。
my %files
= map { $_->{Path} => 1 }
# flatten...
map { ref() eq 'ARRAY' ? @$_ : $_ }
$xml->XMLin("filesmap.xml")->{Item}
;
答案 2 :(得分:1)
如有必要,您可以检查并强制返回数组引用:
my $content = $xml->XMLin("filesmap.xml")->{Item};
$content = ref $content eq 'ARRAY'
? $content
: [$content];