CREATE OR REPLACE FUNCTION table_to_xml(text) RETURNS text AS
$$

use XML::Writer;

my($table, $output) = ($_[0], undef);
my $writer = new XML::Writer( OUTPUT => \$output, DATA_MODE => 1, DATA_INDENT => 4 );

my $query = "SELECT a.attname FROM pg_catalog.pg_attribute a, pg_catalog.pg_class c
WHERE c.relname = '" . $table  . "' AND a.attrelid = c.oid AND a.attnum > 0 AND NOT a.attisdropped";
my $fields = spi_exec_query($query);
my $nfields = $fields->{processed};

$query = 'SELECT * FROM ' . $table;
my $rows = spi_exec_query($query);
my $nrows = $rows->{processed};

$writer->startTag( $table, 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance' );
foreach my $j (0 .. $nrows - 1) {
	$writer->startTag('row');
	my $row = $rows->{rows}[$j];
	foreach my $i (0 .. $nfields - 1) {
		my $field = $fields->{rows}[$i];
		my $field_name = $field->{attname};
		$writer->startTag($field_name);
		$writer->characters( $row->{$field_name} );
        	$writer->endTag($field_name);
	}
	$writer->endTag('row');
}
$writer->endTag($table);

return $output;

$$ LANGUAGE plperlu;