use XML::Rules; my $parser = XML::Rules->new( style => "filter", rules => [ _default => 'raw', tweak => sub { my ($tag, $attr, undef, undef, $parser) = @_; if (exists $parser->{pad}{$attr->{name}}) { %{$parser->{pad}{$attr->{name}}} = %$attr; return; } else { $parser->{pad}{$attr->{name}} = $attr; return [$tag => $attr]; } }, tcf => sub {delete $parser->{pad}; return $_[0] => $_[1]}, ] ); $parser->filter(\*DATA); __DATA__ D1 D2 D3 This should overwrite the old T2.