2013-12-09 33 views
0

輸入文件:SN.xml使用XML ::簡單 - 無法獲得輸出(在HASH)

<?xml version='1.0'?> 
<root> 
<category cname='Cname1' id='c1'> 
    <subcat key='3' sname='Subname1' sid='sid1'> 
    <prod key='1' pname='Productname'>value1</prod> 
    </subcat> 
    <subcat key='4' sname='Subname2' sid='sid1'> 
    <prod key='1' pname='Productname1'>value2</prod> 
    <prod key='2' pname='Productname2'>value3</prod> 
    </subcat> 
</category> 
</root> 

我得就像低於輸出

Subname1 -> Productname 
Subname2 -> Productname1 
Subname2 -> Productname2 

我已經嘗試使用下面的代碼hash

use strict; 
use warnings; 
use XML::Simple; 

my $last; 
my $sub_catname; 
my $filename='SN.xml'; 
my $xs = XML::Simple->new(); 
my $config = $xs->XMLin($filename); 
my $s_category = $config->{'category'}{'subcat'}; 
foreach my $key (sort (keys %{$s_category})){ 
    my $subcat_val=$s_category->{$key}{'sname'}; 
    $last=$key; 
    $sub_catname=$subcat_val; 
} 

my $prod = $s_category->{$last}{'prod'}; 
foreach my $key (sort {$a<=>$b} keys %{$prod}){ 
    my $res_prod = $prod->{$key}{'pname'}; 
      print "$sub_catname -> $res_prod\n"; 
    } 

我得到空輸出。 我已經嘗試data :: dumper工作正常。我無法使用循環打印我的輸出。 在此先感謝。

+0

你有沒有嘗試用'Data :: Dumper'打印你的數據結構?如果沒有,那就這樣做。 – TLP

+0

my $ xs = XML :: Simple-> new(ForceArray => 1); my $ config = $ xs-> XMLin('SN.xml'); print Dumper $ config;這個工作正常,但不工作在哈希 – Vasanth

+1

您需要'ForceArray => [qw(prod)]',或者您需要使用'ref'來找出您有什麼樣的數據。 XML :: Simple是最難使用的XML :: Parser。 – ikegami

回答

0
use strict; 
use warnings; 
use XML::Simple; 

my $last; 
my $filename='SN.xml'; 
my $xs = XML::Simple->new(ForceArray => [qw(prod)]); 
my $config = $xs->XMLin($filename); 
my $s_category = $config->{'category'}{'subcat'}; 
foreach my $key (sort (keys %{$s_category})){ 
    my $subcat_val=$s_category->{$key}{'sname'}; 
    $last=$key; 
} 

my $prod = $s_category->{$last}{'prod'}; 
foreach my $key (sort {$a<=>$b} keys %{$prod}){ 
    my $res_prod = $prod->{$key}{'pname'}; 
      print "$last -> $res_prod\n"; 
    } 
+0

這不會產生所需的輸出。 – choroba

0

使用Data::Dumper可視化複雜的數據結構。這給了你所需要的輸出,並顯示結構,太:

#!/usr/bin/perl 
use warnings; 
use strict; 

use Data::Dumper; 
use XML::Simple; 

my $filename = 'SN.xml'; 
my $xs  = 'XML::Simple'->new(ForceArray => ['prod']); 
my $config = $xs->XMLin($filename); 

print Dumper $config; 

for my $s_category (keys %{ $config->{category}{subcat} }) { 
    for my $prod (keys %{ $config->{category}{subcat}{$s_category}{prod} }) { 
     print $config->{category}{subcat}{$s_category}{sname}, ' -> ', 
       $config->{category}{subcat}{$s_category}{prod}{$prod}{pname}, "\n"; 
    } 
} 

爲了便於比較,這是你如何能得到相同的結果與XML::XSH2,圍繞XML::LibXML包裝:

open SN.xml ; 
for /root/category/subcat { 
    my $sname = @sname ; 
    for prod/@pname echo $sname -> (.) ; 
} 
+0

我需要使用循環.. – Vasanth

+0

@Vasanth:爲什麼?如果您的輸入不同,請舉一個更好的例子。 – choroba

+0

更新了新的輸入和輸出。 – Vasanth