Subject: | zero values are removed in obj2xml and save |
If XML::Bare reads in something like <xml><v>0</v></xml> and then writes it back out, it gets changed to <xml><v /></xml>.
This test fails on 0.53 and illustrates the issue:
----
use strict;
use XML::Bare;
use Test::More tests => 1;
my $test_xml = '<xml><v>0</v></xml>';
my $obj = XML::Bare->new(text => $test_xml);
my $root = $obj->parse;
my $reverse_xml = XML::Bare::obj2xml( $root );
# strip newlines for a easy comparison
$reverse_xml =~ s/\n//g;
is($reverse_xml, $test_xml, 'obj2xml returns original xml');
----
Here is the patch we are using that seems to resolve the issue:
----
index d10e595..2cfaacf 100755
--- a/lib/perl5/site_perl/5.22.1/x86_64-linux/XML/Bare.pm
+++ b/lib/perl5/site_perl/5.22.1/x86_64-linux/XML/Bare.pm
@@ -674,7 +674,7 @@ sub obj2xml {
return $posa <=> $posb;
} keys %$objs;
for my $i ( @dex ) {
- my $obj = $objs->{ $i } || '';
+ my $obj = $objs->{ $i } // '';
my $type = ref( $obj );
if( $type eq 'ARRAY' ) {
$imm = 0;
@@ -721,7 +721,7 @@ sub obj2xml {
my $cr = $imm ? '' : "\n";
if( substr( $name, 0, 1 ) ne '_' ) {
if( $name ) {
- if( $xml ) {
+ if( defined $xml ) {
$xml = $pad . '<' . $name . $att . '>' . $cr . $xml . $pad2 . '</' . $name . '>';
}
else {
----
This patch doesn't seem to cause any other problems, and the other tests in the XML::Bare test suite still pass after this change. So it would be nice to get this change approved by the author and merged into the code base because XML::Bare is a great option if you just want to read in xml to a data structure, change the data a bit, and then write it back out, but this bug can definitely bite you if that's how you are using the module.