use strict; use warnings; use DBI; use XML::Writer; use Data::Dumper; my $dbh = DBI->connect( ... ); my $writer = XML::Writer->new(); $writer->xmlDecl('UTF-8'); $writer->doctype('xml'); $writer->startTag('xml'); my $aa_sql = 'select id,field1,field2,field3 from AA'; my $bb_sql = 'select type, value from BB where id = ?'; for my $row (@{$dbh->selectall_arrayref($aa_sql)}) { $writer->startTag('foo',id => $row->[0]); $writer->dataElement("field$_",$row->[$_]) for 1..3; # warning: i should check for 'bars' before i start a tag $writer->startTag('bars'); for $_ (@{$dbh->selectall_arrayref($bb_sql,undef,$row->[0])}) { $writer->dataElement('bar',$_->[1],type => $_->[0]); } $writer->endTag('bars'); $writer->endTag(); } $writer->endTag('xml'); $dbh->disconnect;