use strict; use warnings; use XML::Twig; my $xml = <<'XML'; XML my $twig = XML::Twig->new( start_tag_handlers => { 'UML:Class' => \¨_class_start, 'UML:Package' => \¨_package_start, }, twig_handlers => { # purge at the end of each class section 'UML:Class' => sub { $_[0]->purge }, 'UML:Attribute' => \¨_attribute, 'UML:Generalization' => \¨_generalization, 'UML:TaggedValue' => \¨_taggedvalue, }, ); $twig->parse ($xml); sub uml_class_start { my ($twig, $elt) = @_; my $xmi_id = $elt->att( 'xmi.id' ); my $name = $elt->att( 'name' ); } sub uml_package_start { } sub uml_taggedvalue { my ($twig, $elt) = @_; if ($elt->parent (qr/UML:Attribute/)){ uml_taggedvalue_attr (@_); } elsif ($elt->parent (qr/^UML:Class$/)) { print "Ignoring class taggedvalue\n"; } else { uml_taggedvalue_def (@_); } } sub uml_generalization { } sub uml_attribute { } sub uml_taggedvalue_attr { print "uml_taggedvalue_attr\n"; } sub uml_taggedvalue_def { print "uml_taggedvalue_def\n"; }