1

我正在尝试修改我在网上找到的 Perl 脚本,该脚本使用 XML::Parser 来识别 XML 文档的唯一元素以及每个元素出现的次数。Perl 脚本及其文档可以在这里找到:

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)

我的问题是如何在输出中包含父节点?

4

1 回答 1

2

父节点名称由current_elementso do给出$name= $expat->current_element . '/' . $element,瞧!如果您想避免出现空父名称的警告,请使用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}++;
}
于 2013-06-20T17:23:17.483 回答