http://www.perlmonks.org?node_id=128897
Category: E-Mail Programs
Author/Contact Info Hendrik Van Belleghem (beatnik -at- quickndirty -dot- org)
Description: This code converts a Palms Addressbook to Sylpheeds addressbook. It uses XML::Writer, Palm::Addressbook (and parent modules). Sylpheed is a GTK+ based, lightweight, and fast e-mail client.
See comments for more info.
#!/usr/bin/perl

use strict;
use Palm::Address;
use XML::Writer;
use IO;

# Yes, this is copyright by me.

# Palm::Address converter to Sylpheed's XML Format
# Format tested on Sylpheed 0.6.4
# See http://sylpheed.good-day.net

# Yes, I do know Sylpheed can do this too but that feature failed to c
+ompile for me
# You need to edit addrbook--index.xml so it has an entry as shown bel
+ow.
#    <book name="Palm" file="addrbook-000003.xml" />
# The bookname can be changed but you'll need to change the source too
+.
# You need to rename/move the output to the .sylpheed directory in you
+r homedir

my $pdb = Palm::Address->new();
$pdb->Load("AddressDB.pdb");
my $output = new IO::File(">output.xml");
my $writer = new XML::Writer(OUTPUT => $output,DATA_MODE=>1, DATA_INDE
+NT=>3);
$writer->xmlDecl("ISO-8859-1");
# This is ok for me, tweak it !
$writer->startTag("address-book","name"=>"Palm");
# Change name here
my $id = int rand(300000);
# I have NO idea if the UID needs to be sequential but this works
foreach my $record (@{$pdb->{records}})
{ my $email_loc;
  for (1..5)
  { if ($record->{phoneLabel}{"phone$_"} eq "4")
    { $email_loc = $_; }
  }
  # Find which Phone field is for E-Mail
  if ($record->{fields}{"phone$email_loc"} =~ /\@/)
  { $id++;
    $writer->startTag("person","uid"=>$id,"first-name"=>$record->{fiel
+ds}{firstName},
    "last-name"=>$record->{fields}{name},"nick-name"=>"",
    "cn"=>$record->{fields}{firstName}." ".$record->{fields}{name});
    $writer->startTag("address-list");
    my (@addresses) = split (/\n/,$record->{fields}{"phone$email_loc"}
+);
    foreach my $addr(@addresses)
    {  $id++;
       $writer->startTag("address","uid"=>$id,"alias"=>"","email"=>$ad
+dr,"remarks"=>$record->{fields}{note}); 
       $writer->endTag("address");    
    }
    $writer->endTag("address-list");
    $writer->startTag("attribute-list");
    foreach my $key (keys %{$record->{fields}})
    { if ($key ne "name" && $key ne "firstName" && $key ne "phone$emai
+l_loc" && $key ne "note")
      { $id++;
        $writer->startTag("attribute","uid"=>$id,"name"=>$pdb->{appinf
+o}{fieldLabels}{$key});
    $writer->characters($record->{fields}{$key});
        $writer->endTag("attribute");
      }
    }
    $writer->endTag("attribute-list");
    $writer->endTag("person");
  }
}
$writer->endTag("address-book");
$writer->end();
$output->close();