#! /usr/bin/perl -w # Released under the Perl Artistic License # # copyright 2007 Celejar # usage: clawsxml2csv < [/path/to/]addrbook-000001.xml > addrbook-000001.csv use XML::Parser; use Text::CSV_XS; use IO::Wrap; use strict; my %known_elements = ('person', \&person, 'address', \&address); my (%person_attrs, %address_attrs); my @person_import_fields = ('first-name', 'last-name', 'cn', 'nick-name'); my @address_import_fields = ('email', 'remarks'); my $parser = new XML::Parser; $parser->setHandlers('Start' => \&start_handler); my $csv = new Text::CSV_XS({'binary' => 1}); my $stdout = wraphandle(\*STDOUT); $parser->parse(*STDIN); # The End! sub start_handler { my $parser = shift; my $element = shift; &{$known_elements{$element}}(@_) if $known_elements{$element}; } sub person { %person_attrs = @_; } sub address { %address_attrs = @_; $csv->print($stdout, [@person_attrs{@person_import_fields}, @address_attrs{@address_import_fields}]); print "\n"; }