use strict; use warnings; use XML::Twig; my $xfile = <<'EOF'; 3 Target P6 12 Good P6 EOF my $t= new XML::Twig( twig_handlers => {document => \&doc} ); $t->parse($xfile); sub doc { my ($twig, $doc) = @_; my $doc_csv = join ',', $doc->att('datetime'), $doc->att('id'), $doc->att('sourcecategory'), $doc->att('schemeversion'); print "$doc_csv\n" unless $doc->children('record'); for my $rec ($doc->children('record')) { print join ',', $doc_csv, $rec->first_child('sentence-number')->text(), $rec->first_child('data-class' )->text(), $rec->first_child('group' )->text(); print "\n"; } } __END__ 2006/01/25,\2006\200601\20060125\20060125_18.txt,News Archive,1.1 2006/01/25,\2006\200601\20060125\20060125_19.txt,News Archive,1.1,3,Target,P6 2006/01/25,\2006\200601\20060125\20060125_19.txt,News Archive,1.1,12,Good,P6