1

オンラインで見つけた、XML::Parser を使用して XML ドキュメントの一意の要素と各要素の出現回数を識別する Perl スクリプトを変更しようとしています。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 に答える