我有XML,
<queue>
<user>1</user>
<user>2</user>
<user>3</user>
</queue>
我正在尝试迭代它以获得user
use XML::Simple;
use Data::Dumper;
my $xml = "<queue><user>1</user><user>2</user></queue>";
my $xml_obj = XMLin($xml, forcearray => 1);
my $users = $xml_obj->{'queue'};
foreach my $v (@users){
print $v;
}
我试过强迫&amp;非强制数组,我也尝试跳过queue
节,并将$users
定义为$xml_obj->{'user'}
,但所有这些都返回未定义的索引警告或空结果; < / p>
答案 0 :(得分:3)
XML::Simple
是一个非常讨厌的图书馆,真的需要去死。它将XML强制转换为类似于perl的数据结构,但这样做的方式意味着您在流程中丢失数据,并且必须猜测将其转换回来。 (它经常猜对了,但并不总是如此,这就是为什么你用力数组等得到所有废话的原因。)
这就是为什么它在文档中说:
不鼓励在新代码中使用此模块。其他模块可用,提供更直接和一致的接口
我强烈建议您考虑另一个XML库。 XML::LibXML
或XML::Twig
- 我喜欢后者:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
my $xml_str = '<queue>
<user>1</user>
<user>2</user>
<user>3</user>
</queue>';
my $twig = XML::Twig -> new -> parse ( $xml_str );
foreach my $user ( $twig -> root -> children('user') ) {
print $user -> text,"\n";
}
请注意 - XML::Twig
使用simplify
方法:
simplify (%options)
返回一个与XML :: Simple相似的数据结构。选项与XMLin选项相同,有关更多详细信息,请参阅XML :: Simple doc(或使用DATA :: dumper或YAML转储数据结构)
这可以让你更容易潜入其中。
但是根据您的示例 - 您遗失的只有use strict;
use warnings;
以及可能告诉您的事情:
全球符号&#34; @ users&#34;需要显式包名称
E.g:
你需要打印你的对象 - 它是:
$VAR1 = {
'user' => [
'1',
'2'
],
'queue' => {}
};
请注意XML::Simple
如何将queue
作为单独的哈希键 - user
被视为同一父元素中的数组。 (这只是XML::Simple
)的陷阱之一。
所以:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Simple;
use Data::Dumper;
my $xml = "<queue><user>1</user><user>2</user></queue>";
my $xml_obj = XMLin($xml, forcearray => 1);
my $users = $xml_obj->{'user'};
foreach my $v (@$users){
print $v;
}
注意 - 也将$users
解引用到数组中。
答案 1 :(得分:0)
我想你是想做的:
use XML::Simple;
use Data::Dumper;
my $xml = "<queue><user>1</user><user>2</user></queue>";
my $xml_obj = XMLin($xml);
print Dumper($xml_obj);
输出:
$VAR1 = {
'user' => [
'1',
'2'
]
};
但XML :: Simple非常糟糕+我觉得这是一个功课。