home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / share / doc / libxml-parser-perl / examples / xmlstats < prev   
Encoding:
Text File  |  2004-11-24  |  3.1 KB  |  187 lines

  1. #!/usr/bin/perl -w
  2. #
  3. # $Revision: 1.1.1.1 $
  4. #
  5. # $Date: 2003/07/27 11:07:11 $
  6.  
  7. package Elinfo;
  8.  
  9. sub new {
  10.     bless { COUNT   => 0,
  11.             MINLEV  => undef,
  12.             SEEN    => 0,
  13.             CHARS   => 0,
  14.             EMPTY   => 1, 
  15.             PTAB    => {},
  16.             KTAB    => {},
  17.             ATAB    => {} }, shift;
  18. }
  19.  
  20.  
  21. package main;
  22.  
  23. use English;
  24. use XML::Parser;
  25.  
  26. my %elements;
  27. my $seen = 0;
  28. my $root;
  29.  
  30. my $file = shift;
  31.  
  32. my $subform =
  33.     '      @<<<<<<<<<<<<<<<      @>>>>';
  34. die "Can't find file \"$file\""
  35.   unless -f $file;
  36.     
  37. my $parser = new XML::Parser(ErrorContext => 2);
  38. $parser->setHandlers(Start => \&start_handler,
  39.              Char  => \&char_handler);
  40.  
  41. $parser->parsefile($file);
  42.  
  43. set_minlev($root, 0);
  44.  
  45. my $el;
  46.  
  47. foreach $el (sort bystruct keys %elements)
  48. {
  49.     my $ref = $elements{$el};
  50.     print "\n================\n$el: ", $ref->{COUNT}, "\n";
  51.     print "Had ", $ref->{CHARS}, " bytes of character data\n"
  52.     if $ref->{CHARS};
  53.     print "Always empty\n"
  54.     if $ref->{EMPTY};
  55.  
  56.     showtab('Parents', $ref->{PTAB}, 0);
  57.     showtab('Children', $ref->{KTAB}, 1);
  58.     showtab('Attributes', $ref->{ATAB}, 0);
  59. }
  60.  
  61.  
  62. ################
  63. ## End of main
  64. ################
  65.  
  66. sub start_handler
  67. {
  68.     my $p = shift;
  69.     my $el = shift;
  70.  
  71.     my $elinf = $elements{$el};
  72.  
  73.     if (not defined($elinf))
  74.     {
  75.     $elements{$el} = $elinf = new Elinfo;
  76.     $elinf->{SEEN} = $seen++;
  77.     }
  78.  
  79.     $elinf->{COUNT}++;
  80.  
  81.     my $partab = $elinf->{PTAB};
  82.  
  83.     my $parent = $p->current_element;
  84.     if (defined($parent))
  85.     {
  86.     $partab->{$parent}++;
  87.     my $pinf = $elements{$parent};
  88.  
  89.     # Increment our slot in parent's child table
  90.     $pinf->{KTAB}->{$el}++;
  91.     $pinf->{EMPTY} = 0;
  92.     }
  93.     else
  94.     {
  95.     $root = $el;
  96.     }
  97.  
  98.     # Deal with attributes
  99.  
  100.     my $atab = $elinf->{ATAB};
  101.  
  102.     while (@_)
  103.     {
  104.     my $att = shift;
  105.     
  106.     $atab->{$att}++;
  107.     shift;    # Throw away value
  108.     }
  109.  
  110. }  # End start_handler
  111.  
  112. sub char_handler
  113. {
  114.     my ($p, $data) = @_;
  115.     my $inf = $elements{$p->current_element};
  116.  
  117.     $inf->{EMPTY} = 0;
  118.     if ($data =~ /\S/)
  119.     {
  120.     $inf->{CHARS} += length($data);
  121.     }
  122. }  # End char_handler
  123.  
  124. sub set_minlev
  125. {
  126.     my ($el, $lev) = @_;
  127.  
  128.     my $elinfo = $elements{$el};
  129.     if (! defined($elinfo->{MINLEV}) or $elinfo->{MINLEV} > $lev)
  130.     {
  131.     my $newlev = $lev + 1;
  132.  
  133.     $elinfo->{MINLEV} = $lev;
  134.     foreach (keys %{$elinfo->{KTAB}})
  135.     {
  136.         set_minlev($_, $newlev);
  137.     }
  138.     }
  139. }  # End set_minlev
  140.  
  141. sub bystruct
  142. {
  143.     my $refa = $elements{$a};
  144.     my $refb = $elements{$b};
  145.  
  146.     $refa->{MINLEV} <=> $refb->{MINLEV}
  147.     or $refa->{SEEN} <=> $refb->{SEEN};
  148. }  # End bystruct
  149.  
  150.  
  151. sub showtab
  152. {
  153.     my ($title, $table, $dosum) = @_;
  154.  
  155.     my @list = sort keys %{$table};
  156.  
  157.     if (@list)
  158.     {
  159.     print "\n   $title:\n";
  160.  
  161.     my $item;
  162.     my $sum = 0;
  163.     foreach $item (@list)
  164.     {
  165.         my $cnt = $table->{$item};
  166.         $sum += $cnt;
  167.         formline($subform, $item, $cnt);
  168.         print $ACCUMULATOR, "\n";
  169.         $ACCUMULATOR = '';
  170.     }
  171.  
  172.     if ($dosum and @list > 1)
  173.     {
  174.         print  "                            =====\n";
  175.         formline($subform, '', $sum);
  176.         print $ACCUMULATOR, "\n";
  177.         $ACCUMULATOR = '';
  178.     }
  179.     }
  180.  
  181. }  # End showtab
  182.  
  183. # Tell Emacs that this is really a perl script
  184. # Local Variables:
  185. # mode:perl
  186. # End:
  187.