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";
}
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";
}
}