home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / share / doc / libxml-grove-perl / examples / visitor.pl < prev   
Encoding:
Perl Script  |  1999-10-23  |  1.5 KB  |  67 lines

  1. #
  2. # Copyright (C) 1998 Ken MacLeod
  3. # See the file COPYING for distribution terms.
  4. #
  5. # $Id: visitor.pl,v 1.5 1999/05/06 23:13:02 kmacleod Exp $
  6. #
  7.  
  8. use XML::Parser::PerlSAX;
  9. use XML::Grove;
  10. use XML::Grove::Builder;
  11. use Data::Grove::Visitor;
  12.  
  13. my $builder = XML::Grove::Builder->new;
  14. my $parser = XML::Parser::PerlSAX->new(Handler => $builder);
  15.  
  16. my $visitor = new MyVisitor;
  17.  
  18. my $doc;
  19. foreach $doc (@ARGV) {
  20.     my $grove = $parser->parse (Source => { SystemId => $doc} );
  21.  
  22.     my @context;
  23.     $grove->accept ($visitor, \@context);
  24. }
  25.  
  26. package MyVisitor;
  27.  
  28. sub new {
  29.     my $class = shift;
  30.  
  31.     return bless {}, $class;
  32. }
  33.  
  34. sub visit_document {
  35.     my $self = shift; my $grove = shift;
  36.  
  37.     $grove->children_accept ($self, @_);
  38. }
  39.  
  40. sub visit_element {
  41.     my $self = shift; my $element = shift; my $context = shift;
  42.  
  43.     push @$context, $element->{Name};
  44.     my @attributes = %{$element->{Attributes}};
  45.     print STDERR "@$context \\\\ (@attributes)\n";
  46.     $element->children_accept ($self, $context, @_);
  47.     print STDERR "@$context //\n";
  48.     pop @$context;
  49. }
  50.  
  51. sub visit_pi {
  52.     my $self = shift; my $pi = shift; my $context = shift;
  53.  
  54.     my $target = $pi->{Target};
  55.     my $data = $pi->{Data};
  56.     print STDERR "@$context ?? $target($data)\n";
  57. }
  58.  
  59. sub visit_characters {
  60.     my $self = shift; my $characters = shift; my $context = shift;
  61.  
  62.     my $data = $characters->{Data};
  63.     $data =~ s/([\x80-\xff])/sprintf "#x%X;", ord $1/eg;
  64.     $data =~ s/([\t\n])/sprintf "#%d;", ord $1/eg;
  65.     print STDERR "@$context || $data\n";
  66. }
  67.