René Nyffenegger's collection of things on the web
René Nyffenegger on Oracle - Most wanted - Feedback -
 

XML::Parser

use strict;
use warnings;

use XML::Parser;

open XML_DOCUMENT, $ARGV[0];

my $xml_parser=new XML::Parser(Style=>'Stream');

$xml_parser->setHandlers (
   Start   => \&start_element,
   End     => \&end_element,
   Char    => \&character_data,
   Default => \&default);

$xml_parser->parse(*XML_DOCUMENT);

close XML_DOCUMENT;

sub start_element {

  my($parseinst, $element, %attributes) = @_;

  #print "  parseinst: $parseinst\n"; 
  print "start element: [$element]\n";

  foreach my $attribute (keys %attributes) {
    print "    $attribute = $attributes{$attribute}\n"
  }

  print "\n";
}

sub end_element {
  my($parseinst, $element, %attributes) = @_;

  #print " parseinst: $parseinst\n"; 
  print "end element: [$element]\n";

  foreach my $attribute (keys %attributes) {
    print "    $attribute = $attributes{$attribute}\n"
  }

  print "\n";
}

sub character_data {
  my($parseinst, $data) = @_;
  $data =~ s/{amp}/&/;

  print "character data:\n";
  print "  data: $data\n"; 

  print "\n";
}

sub default {
  #print "default\n\n";
}

example.xml
<bla>one two
  <foo x='bar'>three</foo>
</bla>
use warnings;
use strict;
use XML::Parser;

my %tags;
my $indent = 0;

parse_instance('example.xml');

exit;

#for my $tag (keys %tags){
#  print "found tag: $tag\n";
#}


sub parse_instance {
  my $file_name = shift;
  
  my $xml_parser = new XML::Parser(
    Handlers => {
      Start    => \&start,
      End      => \&end,
      Char     => \&char,
    }
  );
  
  $xml_parser->parsefile($file_name);
}


sub start {

  my $p = shift;
  my $tag = shift;
  
  my %kv = @_;
  
  print " " x $indent;
  print "start: $tag { ";
  
  #y $k =shift;
  for my $k (keys %kv) {
    my $v = $kv{$k};
    print " $k=$v";
  }
  
  print "\n";
  
  $indent ++;
  
  $tags{$tag} = 1;
}

sub end {
  my $p = shift;
  my $tag = shift;
  
  $indent--;
  
  print " " x $indent;
  print "end: $tag } \n";
}

sub char {
  my $p = shift;
  my $c = shift;
  
  if ($c =~ /\w/) {
    print " " x $indent;
    print "char: $c\n";
  }
}