2013-06-20 57 views
1

我想修改一個我在線發現的使用XML :: Parser標識XML文檔的獨特元素以及每個元素髮生次數的Perl腳本。 Perl腳本及其文檔可以發現here使用XML :: Parser包含父節點

use strict; 
use warnings; 

use XML::Parser; 
use File::Find; 

@ARGV or die "usage: xmlelements DIR [DIR ...]\n"; 

my %element_count; 

my $parser = XML::Parser->new(
    Handlers => { 
     Start => \&start_element, 
    }, 
); 

find \&process_xml, @ARGV; 
print "$_ ($element_count{ $_ })\n" 
    for sort keys %element_count; 
exit; 


sub process_xml { 
    $parser->parsefile($_) 
     if substr($_, -4) eq '.xml' and -f; 
} 

sub start_element { 
    my ($expat, $element, @attrval) = @_; 
    $element_count{ $element }++; 
} 

這產生一個輸出像這樣:

Account (15614) 
Account_No (15504) 
Active (15614) 
Activity (6658) 
Address (28098) 
Address_1 (27548) 
Address_2 (2033) 
Address_3 (62) 
Address_City (15) 

我的問題是我怎麼也包括在輸出中的父節點?

回答

1

父節點名稱由current_element給出,所以$name= $expat->current_element . '/' . $element和voilà!如果你想避免空父名的警告,使用my $parent= $expat->current_element || ''; $name = "$parent/$element";

所以處理變得這樣的:

sub start_element { 
    my ($expat, $element, @attrval) = @_; 
    my $parent= $expat->current_element || ''; 
    my $name= "$parent/$element"; 
    $element_count{$name}++; 
} 
+0

感謝您的答覆@mirod,這正是我一直在尋找。我對Perl非常陌生,請告訴我腳本中的哪些地方應該放置該行代碼?我不斷收到有關顯式包名稱的錯誤。 – ngwilliams

+0

你可能有警告,因爲你沒有用'my $ name;'聲明'$ name'。我已經更新了我的答案,爲您提供處理程序的完整代碼。 – mirod

+0

有沒有一種方法可以使用current_element獲取完整路徑?我現在意識到我也需要祖父節點。 – ngwilliams