The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w
use strict;

use XML::Twig;

$|=1;

my $TMAX=1; # do not forget to update!
print "1..$TMAX\n";

my $doc= read_data();

my $t= XML::Twig->new( ignore_elts => { ignore => 1 },
                       keep_spaces => 1,
		     );
my $result_file= "test_ignore_elt.res1";
open( RESULT, ">$result_file") or die "cannot create $result_file: $!";
select RESULT;
$t->parse( $doc);
$t->print;
select STDOUT;
close RESULT;
check_result( $result_file, 1);

exit 0;

# Not yet implemented

# test 2
$doc= read_data();

$t= XML::Twig->new( ignore_elts =>   { ignore => 'print' },
                    twig_handlers => { elt    => sub { $_->print; } },
                    keep_spaces => 1,
                  );
$result_file= "test_ignore_elt.res2";
open( RESULT, ">$result_file") or die "cannot create $result_file: $!";
select RESULT;
$t->parse( $doc);
$t->print;
select STDOUT;
close RESULT;
check_result( $result_file, 2);



sub read_data
  { local $/="\n\n";
    my $data= <DATA>;
    $data=~ s{^\s*#.*\n}{}m; # get rid of comments
    $data=~ s{\s*$}{}s;     # remove trailing spaces (and \n)
    $data=~  s{(^|\n)\s*(\n|$)}{}g;    # remove empty lines
    return $data;
  };

  
sub check_result
  { my( $result_file, $test_no)= @_;
    # now check result
    my $expected_result= read_data();
    my $result= read_result( $result_file);
    if( $result eq $expected_result)
      { print "ok $test_no\n"; }
    else
      { print "not ok $test_no\n"; 
        print STDERR "\ntest $test_no:\n",
	             "expected: \n$expected_result\n",
                     "real: \n$result\n";
      }
  }


sub read_result
  { my $file= shift;
    local $/="\n";
    open( RESULT, "<$file") or die "cannot read $file: $!";
    my @result= grep {m/\S/} <RESULT>;
    close RESULT;
    unlink $file;
    return join '', @result;
  }


  
__DATA__
# doc 1
<doc>
  <ignore>text<child ok="no"/></ignore>
  <elt>
    <child ok="yes"/>
    <ignore>text<child ok="no"/></ignore>
  </elt>
</doc>

# expected result 1
<doc>
  <elt>
    <child ok="yes"/>
  </elt>
</doc>

#doc 2
<doc>
  <ignore>text<child ok="no"/></ignore>
  <elt>
    <child ok="yes"/>
  </elt>
  <ignore>text<child ok="no"/></ignore>
</doc>

# expected result 2
  <ignore att="val">text<child ok="no"/></ignore>
  <elt>
    <child ok="yes"/>
  </elt>
  <ignore>text<child ok="no"/></ignore>