use warnings; use strict; use XML::Parser; my $xmlStr = < XML use constant kIndentSize => 4; my $indent = ''; my $xs1 = XML::Parser->new ( Handlers => { Start => sub {start (\$indent, @_);}, End => sub {end (\$indent, @_);}, Char => sub {char (\$indent, @_);} }); $xs1->parse ($xmlStr); sub start { my ($indent, $expat, $element, %attr) = @_; print "$$indent$element\n"; $$indent .= ' ' x kIndentSize; print "$$indent$_ : $attr{$_}\n" for sort keys %attr; return; } sub end { my ($indent, $expat, $element) = @_; substr $$indent, -(kIndentSize), kIndentSize, ''; return; } sub char { my ($indent, $expat, $string) = @_; chomp $string; $string =~ s/^\s+|\s+$//g; return unless length $string; print "$$indent$string\n"; return; } #### A B C element name : p online : yes type : k element name : e online : yes type : i D element name : pd online : no type : kd element name : ed online : yes type : id element name : zd online : no type : yd Z C element name : z online : yes type : k element name : p online : yes type : t E element name : pd online : no type : kd element name : ed online : yes type : id