perl <<'EOF' use warnings; use strict; use XML::LibXML; my($data) = './work/data.xml'; my($file) = './out/data.csv'; open(my $out, '>', $file) or die "Could not open file '$file' $!"; my($parser) = XML::LibXML->new(); my $xmldata = $parser->parse_file($data); my @childarray; #The first 2 loop blocks print column headings #Dimensions ########################### #Fixed Date Heading ########################### push( @childarray, qq("WTDate")); for my $node ( $xmldata->findnodes( '/DimensionalReport/ReportDefinition/list/Dimension' )) { for my $dimension ($node->findnodes('*[2]')) { my $child = $dimension->to_literal; if ($dimension->nodeName eq "string") { $child = qq("$child"); } push( @childarray, $child); } } #Measures for my $node ( $xmldata->findnodes( '/DimensionalReport/ReportDefinition/list/Measure' )) { for my $measure ($node->findnodes('*[1]')) { my $child = $measure->to_literal; if ($measure->nodeName eq "string") { $child = qq("$child"); } push( @childarray, $child); } } print $out join(",", @childarray), "\n"; undef @childarray; #Print Data #Records for my $node ( $xmldata->findnodes( '/DimensionalReport/list/DataRow' )) { for my $lvldim ($node->findnodes('./list/list/DataRow')) { my $dim1 = $node->getAttribute("name"); if ($node->nodeName eq "string" or $node->nodeName eq "list") { $dim1 = qq("$dim1"); } push( @childarray, $dim1); my $child = $lvldim->getAttribute("name"); if ($lvldim->nodeName eq "string" or $lvldim->nodeName eq "list") { $child = qq("$child"); } push( @childarray, $child); for my $lvlmeas ($lvldim->findnodes('./list/*')) { my $child = $lvlmeas->to_literal; if ($lvlmeas->nodeName eq "string" or $lvlmeas->nodeName eq "list") { $child = qq("$child"); } push( @childarray, $child); } print $out join(",", @childarray), "\n"; undef @childarray; } } close $out; EOF }