#
# Copyright (C) 1998, 1999 Ken MacLeod
# XML::Grove::AsString is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
#
# $Id: AsString.pm,v 1.6 1999/08/25 17:08:09 kmacleod Exp $
#
use strict;
package XML::Grove::AsString;
use Data::Grove::Visitor;
sub new {
my $class = shift;
my $self = ($#_ == 0) ? { %{ (shift) } } : { @_ };
return bless $self, $class;
}
sub as_string {
my $self = shift; my $object = shift; my $fh = shift;
if (defined $fh) {
return ();
} else {
return join('', $object->accept($self, $fh));
}
}
sub visit_document {
my $self = shift; my $document = shift;
return $document->children_accept($self, @_);
}
sub visit_element {
my $self = shift; my $element = shift;
return $element->children_accept($self, @_);
}
sub visit_entity {
my $self = shift; my $entity = shift; my $fh = shift;
my $mapper = $self->{EntityMap};
return '' if (!defined $mapper);
my $mapping;
if (ref($mapper) eq 'CODE') {
$mapping = &$mapper($entity->{Data},
$self->{EntityMapOptions});
} else {
$mapping = $mapper->lookup($entity->{Data},
$self->{EntityMapOptions});
}
if ($self->{EntityMapFilter}) {
my $filter = $self->{Filter};
if (defined $filter) {
$mapping = &$filter($mapping);
}
}
return $self->_print($fh, $mapping);
}
sub visit_pi {
return ();
}
sub visit_comment {
return ();
}
sub visit_characters {
my $self = shift; my $characters = shift; my $fh = shift;
my $data = $characters->{Data};
if (defined ($self->{Filter})) {
$data = &{$self->{Filter}}($data);
}
return $self->_print($fh, $data);
}
sub _print {
my $self = shift; my $fh = shift; my $string = shift;
if (defined $fh) {
$fh->print($string);
return ();
} else {
return ($string);
}
}
package XML::Grove;
sub as_string {
my $xml_object = shift;
return XML::Grove::AsString->new(@_)->as_string($xml_object);
}
package XML::Grove::Element;
sub attr_as_string {
my $element = shift; my $attr = shift;
my $writer = new XML::Grove::AsString (@_);
return $element->attr_accept ($attr, $writer);
}
1;
__END__
=head1 NAME
XML::Grove::AsString - output content of XML objects as a string
=head1 SYNOPSIS
use XML::Grove::AsString;
# Using as_string method on XML::Grove::Document or XML::Grove::Element:
$string = $xml_object->as_string OPTIONS;
$string = $element->attr_as_string $attr, OPTIONS;
# Using an XML::Grove::AsString instance:
$writer = new XML::Grove::AsString OPTIONS;
$string = $writer->as_string($xml_object);
$writer->as_string($xml_object, $file_handle);
=head1 DESCRIPTION
Calling `C