/usr/local/CPAN/Google-Checkout/Google/Checkout/XML/Writer.pm
package Google::Checkout::XML::Writer;
#--
#-- Writing XML document. Base class.
#--
use strict;
use warnings;
use XML::Writer;
use Google::Checkout::General::GCO;
use Google::Checkout::General::Error;
use Google::Checkout::General::Util qw/make_xml_safe/;
sub new
{
my ($class, %args) = @_;
my $self = { _end_tags => 0, _xml_content => ''};
$self->{_xml_writer} = XML::Writer->new(OUTPUT => \$self->{_xml_content}, UNSAFE => 1);
$self->{_xml_writer}->xmlDecl("UTF-8");
if ($args{root})
{
$self->{_end_tags}++;
$self->{_xml_writer}->startTag($args{root});
}
return bless $self => $class;
}
sub add_element
{
my ($self, %args) = @_;
return Google::Checkout::General::Error->new(
@{$Google::Checkout::General::Error::ERRORS{MISSING_ELEMENT_NAME}})
unless $args{name};
$args{attr} = [] unless $args{attr};
$args{data} = make_xml_safe($args{data}) if ($args{data});
if ((defined $args{data})||(! $args{close})) {
$self->{_xml_writer}->startTag($args{name}, @{$args{attr}});
$self->{_xml_writer}->raw($args{data}) if defined $args{data};
} else {
$self->{_xml_writer}->emptyTag($args{name}, @{$args{attr}});
return 1;
}
if ($args{close})
{
$self->{_xml_writer}->endTag();
}
else
{
$self->{_end_tags}++;
}
return 1;
}
sub close_element
{
my ($self) = @_;
$self->{_end_tags}--;
$self->{_xml_writer}->endTag();
return 1;
}
sub done
{
my ($self) = @_;
$self->{_xml_writer}->endTag() for (1..$self->{_end_tags});
$self->{_xml_writer}->end();
$self->{_xml_content} =~ y/\n\r//d;
return $self->{_xml_content};
}
1;