perl,迭代XML

时间:2015-10-12 12:54:04

标签: xml perl

我有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>

2 个答案:

答案 0 :(得分:3)

XML::Simple是一个非常讨厌的图书馆,真的需要去死。它将XML强制转换为类似于perl的数据结构,但这样做的方式意味着您在流程中丢失数据,并且必须猜测将其转换回来。 (它经常猜对了,但并不总是如此,这就是为什么你用力数组等得到所有废话的原因。)

这就是为什么它在文档中说:

  

不鼓励在新代码中使用此模块。其他模块可用,提供更直接和一致的接口

我强烈建议您考虑另一个XML库。 XML::LibXMLXML::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非常糟糕+我觉得这是一个功课。