in reply to Re^4: Another problem with XML parser
in thread Another problem with XML parser
This is mildly idiomatic (the grep/map, for example, and there is probably an equally terse but less idiomatic version). I hope it's otherwise serviceable and interesting. XML::LibXML and Text::CSV_XS for more fun and deeper options.
Aside: nodeName ne '#text' is more readable but nodeType != 3 is a little more portable (older versions call text nodes "text").
use strict; use warnings; use XML::LibXML; use Text::CSV_XS; my $doc = XML::LibXML->new->parse_fh(\*DATA); my $root = $doc->getDocumentElement; my $csv = Text::CSV_XS->new({ eol => "\n" }); my ( $ip_node ) = $root->findnodes("Header/IpNumber"); my $ip = $ip_node->textContent; open my $out, ">", "$ip.csv" or die "Coulnd't open $ip.csv for writing: $!"; $csv->print( $out, [ $ip, undef ] ); for my $content_element ( $root->findnodes("ContentElement") ) { my @elements = map { $_->textContent } grep { $_->nodeName ne "#text" } $content_element->childNodes; $csv->print( $out, \@elements ); } __DATA__ <someRoot> <Header> <IpNumber>AC_123</IpNumber> </Header> <ContentElement> <IdNumber>xyxyxyxy-yy</IdNumber> <InstanceNumber>001463010000016</InstanceNumber> </ContentElement> <ContentElement> <IdNumber>ceiling-cat</IdNumber> <InstanceNumber>77777777777</InstanceNumber> </ContentElement> <ContentElement> <IdNumber>basement-cat</IdNumber> <InstanceNumber>666666666666666666</InstanceNumber> </ContentElement> </someRoot>
|
|---|