#!perl -T use strict; use warnings; use Test::More tests => 11; use XML::Rules; use Data::Dumper; $Data::Dumper::Indent = 1; $Data::Dumper::Terse = 1; $Data::Dumper::Quotekeys = 0; $Data::Dumper::Sortkeys = 1; my $xml = <<'*END*'; value A value B value X value Y value Achld chld A chld X value Bchld chld A chld X value Xchld chld A chld X value Ychld chld A chld X value Achld chld A chld X value Xchld chld A chld X *END* my $result_keep = { doc => { 'A:parent_a' => { 'A:child_a' => 'chld A', _content => 'value A ', child_in_a => 'chld', 'x:child_x' => 'chld X' }, 'A:tag_a' => 'value A', 'b:parent_b' => { 'A:child_a' => 'chld A', _content => 'value B ', child_in_b => 'chld', 'x:child_x' => 'chld X' }, 'b:tag_b' => 'value B', 'c:parent_c' => { 'A:child_a' => 'chld A', _content => 'value A ', 'c:child_in_c' => 'chld', 'x:child_x' => 'chld X' }, 'ns1:parent_z' => { 'A:child_a' => 'chld A', _content => 'value X ', 'ns1:child_in_z' => 'chld', 'x:child_x' => 'chld X', 'xmlns:ns1' => 'http://www.some.sdf/sdf_z' }, 'x:parent_x' => { 'A:child_a' => 'chld A', _content => 'value X ', child_in_x => 'chld', 'x:child_x' => 'chld X' }, 'x:tag_x' => 'value X', 'xmlns:x' => 'http://www.some.sdf/sdf_x', 'xmlns:y' => 'http://www.some.sdf/sdf_y', 'y:parent_y' => { 'A:child_a' => 'chld A', _content => 'value Y ', child_in_y => 'chld', 'x:child_x' => 'chld X' }, 'y:tag_y' => 'value Y' } }; my $result_strip = { doc => { 'A:child_a' => 'chld A', 'A:parent_a' => { 'A:child_a' => 'chld A', _content => 'value A ', child_in_a => 'chld' }, 'A:tag_a' => 'value A', 'b:parent_b' => { 'A:child_a' => 'chld A', _content => 'value B ', child_in_b => 'chld' }, 'b:tag_b' => 'value B', 'c:parent_c' => { 'A:child_a' => 'chld A', _content => 'value A ', 'c:child_in_c' => 'chld' }, child_in_x => 'chld', child_in_y => 'chld' } }; my $result_flatten = { doc => { 'A:parent_a' => { 'A:child_a' => 'chld A', _content => 'value A ', child_in_a => 'chld', child_x => 'chld X' }, 'A:tag_a' => 'value A', 'b:parent_b' => { 'A:child_a' => 'chld A', _content => 'value B ', child_in_b => 'chld', child_x => 'chld X' }, 'b:tag_b' => 'value B', 'c:parent_c' => { 'A:child_a' => 'chld A', _content => 'value A ', 'c:child_in_c' => 'chld', child_x => 'chld X' }, parent_x => { 'A:child_a' => 'chld A', _content => 'value X ', child_in_x => 'chld', child_x => 'chld X' }, parent_y => { 'A:child_a' => 'chld A', _content => 'value Y ', child_in_y => 'chld', child_x => 'chld X' }, parent_z => { 'A:child_a' => 'chld A', _content => 'value X ', child_in_z => 'chld', child_x => 'chld X' }, tag_x => 'value X', tag_y => 'value Y' } }; my $parser = new XML::Rules ( rules => [ _default => 'as is', qr/tag_|child/ => 'content', doc => 'no content', ], namespaces => { "http://www.some.sdf/sdf_a" => 'A', "http://www.some.sdf/sdf_b" => 'b', "http://www.some.sdf/sdf_c" => 'c', }, ); my $warnings = ''; $SIG{__WARN__} = sub {$warnings .= $_[0]}; { $warnings = ''; my $result = $parser->parsestring($xml); is_deeply( $result, $result_keep, "Known and unknown namespaces, warn and keep"); ok( $warnings =~ m{^(Unexpected namespace "http://www\.some\.sdf/sdf_[xy]" found in the XML!\n){2}Unexpected namespace "http://www\.some\.sdf/sdf_z" found in the XML!$}, "The warnings were printed"); } { $warnings = ''; $parser->{namespaces}{'*'} = 'keep'; my $result = $parser->parsestring($xml); is_deeply( $result, $result_keep, "Known and unknown namespaces, keep and stay silent"); is( $warnings, '', "No warnings were printed"); } { $warnings = ''; $parser->{namespaces}{'*'} = 'strip'; my $result = $parser->parsestring($xml); #print Dumper($result); is_deeply( $result, $result_strip, "Known and unknown namespaces, strip tags/attributes in unknown namespaces"); is( $warnings, '', "No warnings were printed"); } { $warnings = ''; $parser->{namespaces}{'*'} = ''; my $result = $parser->parsestring($xml); #print Dumper($result); is_deeply( $result, $result_flatten, "Known and unknown namespaces, namespaces->{'*'}='' (remove xmlns:xx and xx:)"); is( $warnings, '', "No warnings were printed"); } { $warnings = ''; $parser->{namespaces}{'*'} = 'die'; eval { my $result = $parser->parsestring($xml); #print Dumper($result); }; ok( $@ =~ m{Unexpected namespace "http://www\.some\.sdf/sdf_[xy]" found in the XML! at}, "Known and unknown namespaces, die if an unknown is found"); is( $warnings, '', "No warnings were printed"); } { my $xml = <<'*END*'; value A value X value Xchld chld A chld X value Xchld chld A chld X This will be skipped bold skipped again. You know. *END* my $result_keep_inner = { doc => { 'A:child_a' => { _content => 'chld A' }, 'A:child_a1' => { _content => 'chld A' }, 'A:tag_a' => { _content => 'value A', attr_a => 'blah A' }, child_in_x => { _content => 'chld' }, keep => 'This will be _bold_. You know.' } }; my $parser = new XML::Rules ( rules => [ _default => 'as is', doc => 'no content', keep => 'content', u => sub {'_' . $_[1]->{_content} . '_'}, ], namespaces => { "http://www.some.sdf/sdf_a" => 'A', "http://www.some.sdf/sdf_b" => 'b', "http://www.some.sdf/sdf_c" => 'c', "*" => 'strip', }, ); my $result = $parser->parsestring($xml); #print Dumper($result); is_deeply( $result, $result_keep_inner, "Known and unknown namespaces, strip tags/attributes in unknown namespaces, keep inner tags"); } __END__ print Dumper($result); #