Não use XML::Simple
. É uma má ideia .
Mas basicamente, o XML é uma estrutura de dados hierárquica, o CSV não é. É impossível resolver uma tradução para o caso geral como resultado.
No entanto, dada uma estrutura de registro padrão, não é muito difícil:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
use Text::CSV;
use Data::Dumper;
my $twig = XML::Twig->new->parse( \*DATA );
#read heading from first record.
my @headings =
map { $_->tag } $twig->findnodes( '//accountingRequest', 0 )->children;
my $csv_out = Text::CSV->new( { binary => 1, eol => "\n" } );
$csv_out->print( \*STDOUT, \@headings );
foreach my $accountingRequest ( $twig->findnodes('//accountingRequest') ) {
my @row = map { $accountingRequest->first_child_text($_) } @headings;
$csv_out->print( \*STDOUT, \@row );
}
Isso extrai a 'tag' de nível superior e, em seguida, os valores correspondentes e os imprime.
Não é perfeito, porque como foi dito - seus dados são hierárquicos. Você tem cisco
registros, que precisa decidir o que deseja fazer com eles - como eles devem ser representados em seu CSV?