2012-01-29 49 views
0

我有一个很难作出的Perl脚本正确解析,它看起来像下面的XML文件:XML ::简单,唯一的名称

<Report name="NAME"> 
<ReportHost name="UNIQUE_1"><HostProperties> 
<tag name="TAG_1">tag_value</tag> 
<tag name="TAG_2">tag_value</tag> 
</ReportHost> 
<ReportHost name="UNIQUE_2"><HostProperties> 
<tag name="TAG_1">tag_value</tag> 
<tag name="TAG_2">tag_value</tag> 
</ReportHost> 

现在,我需要能够调用这些UNIQUE_n不知何故,但我无法管理。自卸车返回如下所示的结构:

'Report' => { 
      'ReportHost' => { 
          'UNIQUE_1' => { 
              'HostProperties' => { 
                   'tag' => { [...] 

我试过ForceArray,但不能让ReportHost数组和惨败。

+0

有什么PROBL他到底?你有'$ data - > {Report} {ReportHost} {UNIQUE_1}','$ data - > {Report} {ReportHost} {UNIQUE_2}'等等。如果你需要遍历主机名,'keys'。 – hobbs 2012-01-29 20:21:24

+0

“HostProperties”的结束标记在哪里? XML似乎并不正确。 – dgw 2012-01-29 20:38:33

回答

3

你说你无法让Perl“正确解析”XML但是你不会说你想要什么样的结果。暂且不论事实,你的示例XML缺少一些关闭标签,也许你想是这样的:

my $report = XMLin(\*DATA, 
    ForceArray => [ 'ReportHost', 'tag' ], 
    KeyAttr => { tag => 'name' }, 
    ContentKey => '-content', 
); 

print Dumper($report); 

其中给出:

$VAR1 = { 
     'ReportHost' => [ 
         { 
         'HostProperties' => { 
              'tag' => { 
                'TAG_1' => 'tag_value', 
                'TAG_2' => 'tag_value' 
                } 
              }, 
         'name' => 'UNIQUE_1' 
         }, 
         { 
         'HostProperties' => { 
              'tag' => { 
                'TAG_1' => 'tag_value', 
                'TAG_2' => 'tag_value' 
                } 
              }, 
         'name' => 'UNIQUE_2' 
         } 
        ], 
     'name' => 'NAME' 
}; 

,你可以通过这样的数据循环:

my $report_hosts = $report->{ReportHost}; 
foreach my $report_host (@$report_hosts) { 
    print "Report: $report_host->{name}\n"; 
    my $props = $report_host->{HostProperties}->{tag}; 
    print " TAG_1: $props->{TAG_1}\n"; 
    print " TAG_2: $props->{TAG_2}\n"; 
} 

我会建议using a different module虽然:-)

+0

这工作完美。我尝试过这些选项,但从来没有一起。谢谢! – Gurzo 2012-01-29 22:07:44